javac命令使用教程

#!/bin/bash
export PATH=~/play-1.2.7:$PATH
#获得当前目录
cur=$(pwd)
echo "pwd:"${cur}
rm -rf ggf10service.jar
output_path=${cur}/classes
echo $output_path
if [ ! -d $output_path ]; then
mkdir $output_path
fi

## 获取依赖库和需要编译的java文件
export libs=`find lib -name "*.jar" |xargs|sed "s/ /:/g"`
export javafiles=`find ./ -name "*.java" |xargs|sed "s/ / /g"`
export play_lib=/opt/play-1.2.7/framework/play-1.2.7.jar
export play_lib_common=`find /opt/play-1.2.7/framework/lib/ -name "*.jar" |xargs|sed "s/ /:/g"`
echo ${javafiles}
##编译
javac -d ${cur}/classes -cp ${libs}:$play_lib:$play_lib_common -encoding utf-8 ${javafiles}
##打包
cd $output_path
jar -cvf ${cur}/ggf10service.jar *

上面是我进行Jenkins构建项目时,用到的脚本

通过DOS、SHELL批处理命令加载Lib并编译和打包Java项目(或者运行项目)
参考地址> http://www.cnblogs.com/icerainsoft/p/4300799.html

使用javac命令最主要的两个参数:-classpath和-sourcepath

-classpath
说法①:设置用户类路径,它将覆盖 CLASSPATH 环境变量中的用户类路径。
若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由当前目录构成。

说法②:设定要搜索类的路径,可以是目录,jar文件,zip文件(里面都是class文件),
会覆盖掉所有在CLASSPATH里面的设定。

总之,classpath 指定的是.class文件(编译时,需要用到的类文件),-classpath可以缩
写成-cp
-sourcepath
说法①:指定用以查找类或接口定义的源代码路径。
与用户类路径一样,源路径项用分号 (;) 进行分隔,它们可以是目录、JAR 归档文件或 ZIP 
归档文件。
如果使用包,那么目录或归档文件中的本地路径名必须反映包名。

注意:通过类路径查找的类,如果找到了其源文件,会进行比较判断.class是否是.java的最新
编译,如果有差异,则重新编译.java来覆盖.class

说法②:设定要搜索编译所需java 文件的路径,可以是目录,jar文件,zip文件(里面都是
java文件)。

个人理解:这一块就是指定编译时,需要用到的java源文件。
1)拿java web来说,项目里一般都有第三方jar包。而且项目都很大,类与类之间相互都有引
用。这个时候上面那两个参数就派上用处了。
2)如果第三方给出的是jar包。我们就使用-classpath参数,来指定jar的位置。
3)如果有多个jar包。在windows下,我们使用";"分好进行分割。在Linux下,我们使用":"
-d
    -d参数是指定编译后的class文件保存的位置。它很好的把源程序和目标代码分离的参数。
    美中不足的是-d需要指定已经存在的目录,不能自动创建。


参考例子:
具体例子:

假设我们有如下的目录结构:
    src-|

          |-foo-|

                   |-Testfoo.Java

          |-baz-|

                    |-Testbaz.java

    classes-|
其中Testfoo.java:
package foo;

public class Testfoo {

//....

}
其中Testbaz.java:
package baz;

import foo.Testfoo;

public class Testbaz {

//...

}
也就是说Testbaz对Testfoo有引用。

我们目标是把Testbaz编译到目录classes里面,试用如下的命令:
javac -d classes src/baz/Testbaz.java
命令失败,因为找不到它依赖的Testfoo。我们可以用以下三种方式来实现:

1.我们最容易考虑到的就是编译被依赖的Testfoo类,并将其加入Testbaz的CLASSPATH
javac -d classes src/foo/Testfoo.java
javac -d classes -classpath classes src/baz/Testbaz.java
第二行使用了-classpath,使得编译器在寻找Testfoo类的时候以classes为根目录,根据根
目录和package名,类名最终定位了需要用的(已编译出来的)Testfoo类。



2.在编译Testbaz的时候把被依赖的Testfoo类加入SOURCEPATH
javac -d classes -sourcepath src src/baz/Testbaz.java
在编译条件里面加入-verbose可以很清楚的看到,编译器在寻找Testfoo类的时候,以src为根
目录,根据根目录和package名,类名最终定位了需要用的(源代码)Testfoo类。



3.把CLASSPATH和SOURCEPATH两者都加进来
javac -d classes src/foo/Testfoo.java
javac -d classes -sourcepath src -classpath classes src/baz/Testbaz.java
两个属性都被加入,编译器首先会判断Testfoo.class和Testfoo.java是否同时存在。如果单
独存在,则适应于以上的方法之一。如果同时存在,则判断.class是否是.java的最新编译,如
果有差异,则重新编译.java来覆盖.class

参考地址

http://blog.csdn.net/caesarzou/article/details/5462189

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值