首页 > 学院 > 开发设计 > 正文

Java包如何更新包里的Class,或重新打包

2019-11-15 00:39:28
字体:
来源:转载
供稿:网友
java包如何更新包里的Class,或重新打包

这里主要介绍 用基础命令的形式执行的方法:

主要用到的只是,javac,jar, java(*.exe)命令,

一.javac[Java源文件编译成Class]

1.常用指令:  javac-cp指定多个classpath

javac -classpath可以指定类路径 来编译java文件如:javac -classpath **/servlet-api.jar **.java 来编译某个java文件需要指定多个路径?  是用分号 ;隔开如:javac -cp classes; C:/Tomcat/lib/servlet-api.jar -encoding UTF-8 BeerSelect.java

(直接敲在CMD里面的)这就是用classes下的类文件和 servlet-api.jar一起来编译

BeerSelect.java

PS: 这里要记住重点,在运行这个主程序的时候有可能用到的.jar包都需要把classpath指定,

内部编译引用时才不会报错,如果工程小,包不是很多,不太看重编译时效的话,可以建议把工程

的包多放在一个类库文件下。而打包时也把这个文件夹下的jar包全编译到。

另,-encoding UTF-8是如果待编译文件不全是英文,即’有汉字之类的,可以设置编码,省的

编译报错。

2.其他指令或参数可以在CMD中输入"javac"(plus enter key)或者“javac -help”

(plus enter key)看到注释:

用法:javac <选项> <源文件>

其中,可能的选项包括: -g 生成所有调试信息 -g:none 不生成任何调试信息 -g:{lines,vars,source} 只生成某些调试信息 -nowarn 不生成任何警告 -verbose 输出有关编译器正在执行的操作的消息 -dePRecation 输出使用已过时的 API 的源位置 -classpath <路径> 指定查找用户类文件的位置 -cp <路径> 指定查找用户类文件的位置 -sourcepath <路径> 指定查找输入源文件的位置 -bootclasspath <路径> 覆盖引导类文件的位置 -extdirs <目录> 覆盖安装的扩展目录的位置 -endorseddirs <目录> 覆盖签名的标准路径的位置 -d <目录> 指定存放生成的类文件的位置 -encoding <编码> 指定源文件使用的字符编码 -source <版本> 提供与指定版本的源兼容性 -target <版本> 生成特定 VM 版本的类文件 -version 版本信息 -help 输出标准选项的提要 -X 输出非标准选项的提要 -J<标志> 直接将 <标志> 传递给运行时

二.jar[*.jar Java中引用到的包的操作]

1.常用指令:  jar cf 更新指定包里的指定文件或重打包

e.g. : %JAVA_HOME%/bin/jar cf lib/A.jar sample/B.class (这种格式多是写在*.bat等

批处理文件来执行的,下同)

而利用jar命令直接修改包里面的文件(通常是Class文件)时,一定要很了解原包的结构再动手。

而且记住一个原则,包的引用和实际结构的关系是"." == "/"(解压后会发现是实际的文件夹)

2.其他指令或参数可以在CMD中输入"jar"(plus enter key)或者“jar -help”(plus enter key)

看到注释:

用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...   

  选项:   

  -c 创建新的存档

  -t 列出存档内容的列表

  -x 展开存档中的命名的(或所有的〕文件

  -u 更新已存在的存档

  -v 生成详细输出到标准输出上

  -f 指定存档文件名

  -m 包含来自标明文件的标明信息

  -0 只存储方式;未用zip压缩格式

  -M 不产生所有项的清单(manifest〕文件

  -i 为指定的jar文件产生索引信息

  -C 改变到指定的目录,并且包含下列文件:  

  如果一个文件名是一个目录,它将被递归处理。   

  清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。

首先在资源文件当前目录写一个清单文件example.mf

简单例子可参看:  http://blog.csdn.net/studyvcmfc/article/details/7745500

三.java[Class文件实际运行]

这个应该都比较熟,就是执行Java的Class文件(最后一步)’

java -cp .;c:/dir1/lib.jar Test -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要

全路径到jar包,window上分号“;”

又> e.g. : @"%JAVA_HOME%/bin/java" -cp lib/A.jar; ......sample.B "%~1"

同理可以用java或Java -help来查看:

options命令行选项(网上没找到中文的,自己现在用的也不是中文,凑合先看着吧,用中文系统的,自己打下试试,很简单的)Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...](to execute a jar file)where options include: -client to select the "client" VM -server to select the "server" VM -hotspot is a synonym for the "client" VM [deprecated] The default VM is client. -cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> A ; separated list of directories, JAR archives, and ZIP archives to search for class files. -D<name>=<value> set a system property -verbose[:class|gc|jni] enable verbose output -version print product version and exit -version:<value> require the specified version to run -showversion print product version and continue -jre-restrict-search | -jre-no-restrict-search include/exclude user private JREs in the version search -? -help print this help message -X print help on non-standard options -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] enable assertions -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] disable assertions -esa | -enablesystemassertions enable system assertions -dsa | -disablesystemassertions disable system assertions -agentlib:<libname>[=<options>] load native agent library <libname>, e.g. -agentlib:hprof see also, -agentlib:jdwp=help and -agentlib:hprof=help -agentpath:<pathname>[=<options>] load native agent library by full pathname -javaagent:<jarpath>[=<options>] load Java programming language agent, see java.lang.instrument

总之步骤顺序(1,2,3步)不要搞错了就可以,有忘了的参数再去度娘查。

例‘(在Bat中代码)

bat1.bat source

----------------------------------------------------------

REM @echo offREM 将B.java重新编译成B.class%JAVA_HOME%/bin/javac -cp lib/A.jar;...... -encoding UTF-8 sample/B.javaREM 更新S.jar中B.class%JAVA_HOME%/bin/jar cf lib/S.jar sample/B.classREM 设置内部环境变量(这步看source情况,有的不需要)set FUNC_LANG=zhset INNER_HOME=...PATH=%INNER_HOME%/bin;%PATH%REM 实际调另外的.bat文件运行.java文件bat2.bat sampleFile/test.tif>C:/test/result.txt

bat2.bat source

----------------------------------------------------------

@"%JAVA_HOME%/bin/java" -cp lib/A.jar;... -Dxx=%ss% sample.B "%~1"

这个例子目的主旨是修改lib文件夹下的S.jar(..lib/S.jar) 中的B.class文件,更新即可

S.jar Tree:

S.jar |_____sample | |______B.class |_____META-INF

         |______MANIFEST.MF

所以还是那句话,要改包,提前必须熟悉后这个包的结构,备份一个,然后再改。

※:最后提示一个很容易被忽略的关键点,在编译的第1步中,实体source存放,如果

不想改很多source,一次编译完,并且在第2步直接更新对应包对应关系目录下的

Class的话。自己重写后的.java文件保存位置,一定要营造一个和将要改的包的相对

位置关系一样的路径,否则出错。如这里:若自己重写了B.java文件,那么就要在

source目录下,建立一个sample文件夹,并把自己重写的B.java文件放进去。

这个一般也能从B.java里的首行 package sample; 这样的代码里看出来。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表