java jar执行工具_如何使用Javac/Jar/Java工具对源代码进行编译打包执行

5ee543fd1127eb1fd9229348f069bb74.png

Javac/Jar/Java是JDK的发布包中带的三个基本工具,用于对Java源码进行编译打包运行,本文将介绍这几个工具的使用方法。

1. 代码和演示环境

下面的所有命令演示都是在目录./171221_java_compile_run/中进行,文件的目录结构如下,

+ Simple.java

+ src

- App.java

+ common

- java/com/pphh/demo/Logger.java

+ main

- java/com/pphh/demo/AppPkg.java

+ src2

- AppLogger.java

+ src3

- AppJ7.java

- AppJ8.java

+ target

- app.jar

- common.jar

+ classes

2. Java源码编译

在开发完Java代码后,首先需要对源码进行编译。JDK中带的编译工具为Javac。

javac的命令格式为,

javac [options] [sourcefiles]

其中:

options 命令行选项

sourcefiles 待编译的代码文件

a) 简单的编译

只需要输入代码的文件地址即可

javac ./Simple.java

java Simple

b) 指定编译后的输出目录

使用-d选项,指定编译后的class文件输入目录

javac -d ./target/classes Simple.java

javac -d ./target/classes ./src/main/java/com/pphh/demo/AppPkg.java

c) 编译某个目录下的多个代码文件

使用-sourcepath选项,指定一个代码目录,然后通过通配符*.java获取指定目录下的所有代码文件进行编译,

set src_dir=./src/common/java/com/pphh/demo/

javac -d ./target/classes -sourcepath %src_dir% %src_dir%/*.java

上述命令会将指定目录下Logger.java文件进行编译,并按照package(com.pphh.demo)放置编译好的class文件,具体位置为,

./target/classes/com/pphh/demo/Logger.class

d) 有依赖的编译

可以通过-cp选项,指定依赖的class/Jar文件或所在目录。

例如程序代码src2/AppLogger.java有对前一步产生的Logger.class有依赖,其编译命令为,

javac -cp ./target/classes -d ./target/classes src2/AppLogger.java

上述命令指定了在依赖文件目录为/target/classes,编译代码后,将在目录./target/classes中产生一个AppLogger.class文件。

e) CLASSPATH

在编译的时候,Javac会从如下几个地方查找依赖class文件,

环境变量CLASSPATH定义的依赖文件和目录

当前执行命令的目录

通过-cp/-classpath指定的依赖文件和目录

在指定依赖的时候,可以通过上述几个方法定义依赖的class文件。

f) 编译时指定源码和目标代码的Java版本

可以通过-source/-target选项指定。

javac -d ./target/classes ./src3/AppJ7.java -source 7 -target 7

javac -d ./target/classes ./src3/AppJ8.java -source 8 -target 8

在JDK 9中Javac支持的Java版本包括6, 7, 8, 9,JDK9不再支持-source 5之前的版本。

需要注意的是,源发行版必须高于目标发行版,换句话说Java 7语言级别的代码,可以编译成Java 7/8/9语言级别的目标class文件,但不能编译成Java 6语言级别目标代码。

3. class文件打包

对代码编译之后,为了方便发布和使用,需要使用工具jar对这些class文件进行打包成Jar包。Jar是Java Archives的缩写,意思为Java归档文件。

jar的命令格式为,

jar [options] [ [--release VERSION] [-C dir] files] ...

其中:

options 命令行选项

--release VERSION创建多版本的Jar包,这是JDK9新功能

-C DIR 更改目录路径

a) 简单的打包命令

在打包前,先切换到class文件目录,然后执行打包命令,

cd ./target/classes

jar cvf ../common.jar ./

上述命令将./target/classes目录下所有文件打好包为common.jar,并放置在上一层目录中,也就是./target/下面。

将common.jar放置在classes目录之外,这是为了区分class和jar包文件,防止在下一次运行命令时,将刚刚生成的common.jar也打入下一个包中,形成循环。

b) 打包时更改目录路径到根目录

很多时候我们希望直接指定class的目录路径,但是我们不要使用如下的命令,

jar cvf ./target/common.jar ./target/classes(不推荐此命令,请使用-C选项)

因为上面的命令没有更改目录结构。如果通过解压工具解压common.jar包,会发现里面classes文件目录结构是不对的,classes文件并没有放置在根目录,而且放置在target/classes/中,这个是不对的。

这个时候要使用-C选项,更改目录路径到根目录

jar -cvf ./target/common.jar -C ./target/classes/ .

c) 设置主程序

每一个Jar包都可以设置一个运行主程序,当使用Java -jar命令运行Jar包时,会自动执行这个主程序。

设置主程序要使用-e选项,

jar -cvfe ./target/common1.jar Simple -C ./target/classes/ .

jar -cvfe ./target/common2.jar AppLogger -C ./target/classes/ .

jar -cvfe ./target/common3.jar com.pphh.demo.AppPkg -C ./target/classes/ .

上面的命令将Jar包中的主程序分别设置为Simple\AppLogger\com.pphh.demo.AppPkg,包的运行见后面。

d) 选择指定的class文件打包

除了指定一个class目录,我们还可以指定某些class文件打成Jar包。

下面将指定的一个App.class打入app.jar包中,

jar -cvf ./target/app.jar -C ./target/classes/ Simple.class

下面将一个Logger.class归档为一个日志类库包中,

jar -cvf ./target/logger.jar -C ./target/classes/ ./com/pphh/demo/Logger.class

4. 执行Java程序

在将源码编译成可执行的class文件后,接下来就可以使用java工具来启动运行。

java的命令格式为,

java [options] mainclass [args...]

其中:

options 命令行选项

mainclass 主程序类文件

args 命令行参数

a) 简单的编译运行

javac Simple.java

java Simple

b) 指定class文件或目录

javac -d ./target/classes Simple.java

java -classpath ./target/classes Simple

java -classpath "./target/classes/Simple.class;" Simple

c) 运行一个在指定package的运行程序

javac -d ./target/classes ./src/main/java/com/pphh/demo/AppPkg.java

java -classpath ./target/classes com.pphh.demo.AppPkg

d) 运行一个已配置主程序的Jar包

java -jar ./target/common1.jar

java -jar ./target/common2.jar

java -jar ./target/common3.jar

e) 运行一个未配置主程序的Jar包,通过命令指定运行的主程序

java -classpath "./target/common.jar" Simple

java -classpath "./target/common.jar" AppLogger

java -classpath "./target/common.jar" com.pphh.demo.AppPkg

5. 参考文献

Java 9 SE技术文档:Javac工具命令

Java 9 SE技术文档:Jar工具命令

Java 9 SE技术文档:Java工具命令

Java 7 SE技术文档:Javac工具命令

Java 7 SE技术文档:Jar工具命令

Java 7 SE技术文档:Java工具命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值