命令行运行java程序

 

命令行运行java程序

 

方法1:

普通的jar文件

 

java -cp discard.jar:lib/javassist.jar:lib/netty-all-5.0.0.Alpha1.jar:lib/log4j-1.2.14.jar io.netty.example.discard.DiscardServer

 

其中 io.netty.example.discard.DiscardServer 为java的带main方法的类名

命令行中的jar文件是需要用到的,必须每一个都列出来,不能用*.jar通配符表示

 

方法2:

可运行的jar文件


 

 
 

run_discard.jar是可运行的jar文件,并且将运行类所需的全部jar类库集成为1个jar文件。导出的只有1个jar文件。

java -jar run_discard.jar

 

 

方法三:



 

run_discard_single.jar是可运行的jar文件,并且将运行类所需的全部jar文件存放到与文件run_discard_single.jar同一目录的run_discard_single_lib目录下。因此会导出一个jar文件和一个lib目录(如下图中的run_discard_single_lib目录),在lib目录下有所需的全部jar类库。



java -jar run_discard_single.jar

 

备注:lib目录名不要修改

 

解开run_discard_single.jar可以看到/META-INF/MANIFEST.MF内容为:

 

Manifest-Version: 1.0

Class-Path: . run_discard_single_lib/netty-all-5.0.0.Alpha1.jar run_di

 scard_single_lib/log4j-1.2.14.jar run_discard_single_lib/javassist.jar

Main-Class: io.netty.example.discard.DiscardServer

可以看到这个目录已经在使用中,如果修改了这个目录名,会导致程序无法运行。

 

 

 

JAVA和JAVAC 命令行

javac和java命令行中的-classpath选项
这是个很基础的问题,但是因为基本上都是用现有的IDE工具 来开发java程序,所以很少有人意识到这一点。
javac
-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
-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

 

mac电脑上的例子

 

java -classpath /Users/zjq/workspace/PROJECT_nettydemo5.0.0alpha1/WebContent/WEB-INF/classes:/Users/zjq/workspace/PROJECT_nettydemo5.0.0alpha1/WebContent/WEB-INF/lib/javassist.jar:/Users/zjq/workspace/PROJECT_nettydemo5.0.0alpha1/WebContent/WEB-INF/lib/log4j-1.2.14.jar:/Users/zjq/workspace/PROJECT_nettydemo5.0.0alpha1/WebContent/WEB-INF/lib/netty-all-5.0.0.Alpha1.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/lib/dt.jar stephen.MyServer

 

猜你喜欢

转载自stephen830.iteye.com/blog/2110255