先看一下命令行帮助:
javac -help
Usage: javac <options> <source files>
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
-nowarn Generate no warnings
-verbose Output messages about what the compiler is doing
-deprecation Output source locations where deprecated APIs are used
-classpath <path> Specify where to find user class files and annotation processors
-cp <path> Specify where to find user class files and annotation processors
-sourcepath <path> Specify where to find input source files
-bootclasspath <path> Override location of bootstrap class files
-extdirs <dirs> Override location of installed extensions
-endorseddirs <dirs> Override location of endorsed standards path
-proc:{none,only} Control whether annotation processing and/or compilation is done.
-processor <class1>[,<class2>,<class3>...] Names of the annotation processors to run; bypasses default discovery process
-processorpath <path> Specify where to find annotation processors
-d <directory> Specify where to place generated class files
-s <directory> Specify where to place generated source files
-implicit:{none,class} Specify whether or not to generate class files for implicitly referenced files
-encoding <encoding> Specify character encoding used by source files
-source <release> Provide source compatibility with specified release
-target <release> Generate class files for specific VM version
-version Version information
-help Print a synopsis of standard options
-Akey[=value] Options to pass to annotation processors
-X Print a synopsis of nonstandard options
-J<flag> Pass <flag> directly to the runtime system
-Werror Terminate compilation if warnings occur
@<filename> Read options and filenames from file
从上面可以看出,-cp 和 -classpath 效果是一样的,估计是简写了。
注意,在Windows系统中多个路径 用;来连接,在Unix系统中用:来连接。至于.表示当前路径
一、命令行编译 javac
案例一:
cooldeMacBook-Pro:~ cool$ javac -d /Users/cool/Desktop /Users/cool/Documents/test/*.java #或者 因为当前 操作路径 为 Users/cool/Desktop javac -d /Users/cool/Desktop Documents/test/*.java
编译java文件时,必须要指定 清楚源文件,且需要后缀名.java (*.java 指全部编译)
-d 代表编译好的class文件存放位置(如果java源文件,里面有包名,生成的目标class文件也会带有指定的包名)
案例二:
javac -classpath .;../previousRecord.properties;../lib/jtds-1.2.5.jar;com/cjb/properities/jdbc.properties com/cjb/jdbc/*.java com/cjb/client/*.java -encoding UTF-8
上面命令,表示:编译com/cjb/jdbc下所有java类和com/cjb/client下所有java类,这些类用到了previousRecord.properties文件(它的路径是相对的)和jtds-1.2.5.jar的文件jar包(它的路径也是相对的),同时用的编码是UTF-8。
案例三:
-classpath,设定要搜索类的路径,可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有在CLASSPATH里面的设定。
-sourcepath, 设定要搜索编译所需java 文件的路径,可以是目录,jar文件,zip文件(里面都是java文件)。
所以一个完整的javac命令行应该是这样的,
假设abc.java在路径c:\src里面,在任何的目录的都可以执行以下命令来编译。
javac -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip -sourcepath c:\source\project1\src;c:\source\project2 \lib\src.jar;c:\source\project3\lib\src.zip c:\src\abc.java
表示编译需要c:\classed下面的class文件,c:\jar\abc.jar里面的class文件,c:\zip\abc.zip里面的class文件
还需要c:\source\project1\src下面的源文件,c:\source\project2 \lib\src.jar里面的源文件,c:\source\project3\lib\src.zip里面的源文件,
注意:jar,zip里面的源文件不会有什么改动,目录下的源文件,有可能会被重新编译。
二、命令行运行 java
案例一:
cooldeMacBook-Pro:~ cool$ java -classpath /Users/cool/Desktop/ test.Test
运行test.Test 表示 包名为test 的 Test.class文件。因为这个 目标文件 无法指定 路径。只能靠搜索路径找到。所以 -classpath /Users/cool/Desktop/ 必须要包括 目标执行文件的路径。
案例二:
java -Xms64m -Xmx512m -cp .;../previousRecord.properties;../lib/jtds-1.2.5.jar;com/cjb/properities/jdbc.properties com/cjb/client/MailDispatcherOperation
上面命令,表示:执行com/cjb/client下的MailDispatcherOperation.class(它里面有Main函数)。
案例三:
-classpath, 设定要搜索的类的路径,可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有的CLASSPATH的设定。
由于所要执行的类也是要搜索的类的一部分,所以一定要把这个类的路径也放到-classpath的设置里面。
表现在,在要执行的类的路径里面执行java时,一定要添加上点号(.)标示本目录也要搜索。
假设abc.class在路径c:\src里面
可以在任何路径下执行以下命令
java -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip;c:\src abc
问题:如果main.class属于c:\jar\abc.jar,并且在com.cnblogs.jeffchen这个包里,那么执行java -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip;com.cnblogs.jeffchen.main即可, 但是如果classpath中包含多个jar包呢?并且其他jar包中也有com.cnblogs.jeffchen会发生什么情况?错误?
三、不同系统,表示路径的区别
在windows下,
文件路径的分割符为反斜杠 \
类或者java文件列表的分割符为分号 ;
在linux下
文件路径的分隔符位斜杠 /
类或者java文件列表的分隔符为冒号 :
一个linux下编译和运行的例子
/usr/local/java/bin/javac -classpath /tmp/javatest/lib/mail-1.3.3.jar -d /tmp/javatest/bin/ /tmp/javatest/src/jp/co/realseed/Capability.java /usr/local/java/bin/java -classpath /tmp/javatest/lib/mail-1.3.3.jar:/tmp/javatest/bin/ jp.co.realseed.Capability
四、关于-classpath 的细节
google了一下,发现在java6以及后续的版本中,提供了对通配符的支持。
如果您的jdk还是老版本,那么就没法用通配符了,就只能一个一个写了,或者如果是在unix系统中,可以用shell的功能把路径下的所有jar文件拼接起来,
比如 java -classpath $(echo libs/*.jar | tr ‘ ‘ ‘:’) Test
那么java6以后的通配符怎么用呢?
我们看看这个例子
java -classpath “./libs/*” Test
这里的*是指libs目录里的所有jar文件,不能这么写 java -classpath “./libs/*.jar” Test
如果libs目录中既有jar文件又有class文件,我们都想引用,那么就需要这么写
java -classpath “./libs/*;./libs/” Test
注意:windows系统里的分隔符是; Unix系统的分隔符是:
另外需要注意的就是 libs/* 不包含libs目录下的子目录里的 jar文件,比如 libs/folder1/A.jar
如果想包含子目录,那就需要都明确指出,比如
java -cp “./libs/*;./libs/folder1/*” Test
maven中打包依赖的路径配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<excludes>
<exclude>*.properties</exclude>
<exclude>*.xml</exclude>
<exclude>*.sh</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<mainClass>com.hhht.riskcontrol.thirdparty.tongdun.LoginServer</mainClass>
</manifest>
<manifestEntries>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<classpathPrefix>系统会将这个路径下所有的jar包加入到classpath路径中,
<Class-Path>系统会将这个路径加入到classpath中,主要是用于加载配置文件。
参考自:
http://www.cnblogs.com/JeffChen/archive/2008/01/15/1039708.html
https://zhidao.baidu.com/question/371769855407478484.html