你的位置:首页 > Java教程

[Java教程]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 off

REM 将B.java重新编译成B.class
%JAVA_HOME%\bin\javac -cp lib\A.jar;...... -encoding UTF-8 sample\B.java

REM 更新S.jar中B.class
%JAVA_HOME%\bin\jar cf lib\S.jar sample\B.class

REM 设置内部环境变量(这步看source情况,有的不需要)
set FUNC_LANG=zh
set 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;  这样的代码里看出来。