2011 java的cp命令
http://baggioly.iteye.com/blog/857575java -cpjava -cp .;c:\dir1\lib.jar Test -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;” 分隔,linux上是分号“:”分隔。不支持通配符,需要列出所有
http://baggioly.iteye.com/blog/857575
java -cp
java -cp .;c:\dir1\lib.jar Test
-cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;”
分隔,linux上是分号“:”分隔。不支持通配符,需要列出所有jar包,用一点“.”代表当前路径。
使用范例:
java -cp ..\lib\hsqldb.jar org.hsqldb.Server -database mydb
或
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb
--------------------------------------------------------------------
http://blog.csdn.net/feiyu8607/article/details/6906900
java的cp命令
平时都用eclipse执行java程序惯了,今天想在dos下开两个界面看一下程序的消息交互,居然都不会用了,进入class文件所在目录,
执行java SocketServer1 老是报class not found 错误,最后一问需要加java -cp 等参数, 汗颜啦!!
-cp 参数后面是类路径,是指定给解释器到哪里找到你的.class文件,
写法:
java -cp .;myClass.jar packname.mainclassname
classpath中的jar文件能使用通配符,如果是多个jar文件,要一个一个地罗列出来,从某种意义上说jar文件也就是路径。
要指定各个JAR文件具体的存放路径,相同路径有多个可使用通配符
java -cp .;c:\classes\myClass.jar;d:\classes\*.jar packname.mainclassname
例如,calss文件在D:\workspace\Test\src\sockettest 目录下,然后class文件在sockettest 这个package下
进入这个目录
D:\workspace\Test\src\sockettest>java -cp ../ sockettest.SocketServer1
如果是进入父目录即 D:\workspace\Test\src
需要使用D:\workspace\Test\src>java -cp . sockettest.SocketServer1
命令执行
------------------------------------
http://www.mscto.com/JavaBase/2009022463570.html
运行一个可执行的Jar时,Classpath的设置无效问题,java的-cp和-jar
最近做作业的时候碰见了这样的问题,就是我的一个工程引用了第三方的组件,那些组件都是以Jar的形式发布。做好后我把我的工程整个打成了可执行的Jar包,当然没有包含第三方的组件。然而当我执行我的Jar包时,却发现找不到第三方的组件,或者说它找不到第三方组件所在的Jar包,即使设置了classpath也是无效。举个例子:
那个第三方的组件类叫做B,在b包中,代码如下:
packageb;
publicclassB
{
publicvoidshow()
{
System.out.println("ThisisclassBinpackageb.");
}
}
调用它的,我的作业的执行类叫做A,代码如下:
importb.B;
publicclassA
{
publicstaticvoidmain(String[]args)
{
BobjectB=newB();
objectB.show();
}
}
编译都正常,路径结构就是这样:
A.class
b/B.class
在命令提示符下执行JavaA就出现了结果“ThisisclassBinpackageb.”,一切正常。
我将包b打包:
jarcvfB.jarb
生成了B.jar,和A.class在同一目录下,在命令提示符下执行:
java-cp.;B.jarA
也通过,出现了结果。
但我要是将A也打包,当然要写好manifest,执行:
jarcvfmA.jarmanifestA.class
生成A.jar,这个时候,执行就都通不过:
java-cp.;B.jar-jarA.jar
甚至,B类不需要被打包,这个时候cp即使指定为目录,目录下是普通的class文件也不行,换句话说,当执行jar文件时,java后面带的classpath就会无效,就好像,java的cp参数和jar参数不能共存一样。
解决的方案,最简单的方法就是将b包也打进A.jar中:
jarcvfmA.jarmanifest.
以上的事实在JDK1.5下测试得到。
importb.B;
publicclassA
{
publicstaticvoidmain(String[]args)
{
BobjectB=newB();
objectB.show();
}
}
编译都正常,路径结构就是这样:
A.class
b/B.class
在命令提示符下执行javaA就出现了结果“ThisisclassBinpackageb.”,一切正常。
我将包b打包:
jarcvfB.jarb
生成了B.jar,和A.class在同一目录下,在命令提示符下执行:
java-cp.;B.jarA
也通过,出现了结果。
但我要是将A也打包,当然要写好manifest,执行:
jarcvfmA.jarmanifestA.class
生成A.jar,这个时候,执行就都通不过:
java-cp.;B.jar-jarA.jar
甚至,B类不需要被打包,这个时候cp即使指定为目录,目录下是普通的class文件也不行,换句话说,当执行jar文件时,java后面带的classpath就会无效,就好像,java的cp参数和jar参数不能共存一样。
解决的方案,最简单的方法就是将b包也打进A.jar中:
jarcvfmA.jarmanifest.
以上的事实在JDK1.5下测试得到。
importb.B;
publicclassA
{
publicstaticvoidmain(String[]args)
{
BobjectB=newB();
objectB.show();
}
}
编译都正常,路径结构就是这样:
A.class
b/B.class
在命令提示符下执行javaA就出现了结果“ThisisclassBinpackageb.”,一切正常。
我将包b打包:
jarcvfB.jarb
生成了B.jar,和A.class在同一目录下,在命令提示符下执行:
java-cp.;B.jarA
也通过,出现了结果。
但我要是将A也打包,当然要写好manifest,执行:
jarcvfmA.jarmanifestA.class
生成A.jar,这个时候,执行就都通不过:
java-cp.;B.jar-jarA.jar
甚至,B类不需要被打包,这个时候cp即使指定为目录,目录下是普通的class文件也不行,换句话说,当执行jar文件时,java后面带的classpath就会无效,就好像,java的cp参数和jar参数不能共存一样。
解决的方案,最简单的方法就是将b包也打进A.jar中:
jarcvfmA.jarmanifest.
以上的事实在JDK1.5下测试得到。
原因何在呢?现在还不知道。我猜测是不是执行Jar的java会将类搜索的范围限定在Jar文件内,不会跑出去,因此会忽略指向到Jar之外的classpath?
这样,我们做作业的时候,如果用了第三方组件,除非把组件的类文件都拿出来,和自己的作业文件弄到一起打包成Jar,要不然就不能执行!
这样Java就没办法按照组件开发了!我们必须把自己的组件都弄到一起!我们作出的软件就是一个巨大的Jar!
不这样的话,解决方法还有两个。
之一,将组件的Jar文件拷贝到公共JRE目录下的lib\ext下。比如,我的JDK1.5装在C:\ProgramFiles\Java下,之下的j2re1.5.0是公共JRE,就将B.jar拷贝到:
C:\ProgramFiles\Java\j2re1.5.0\lib\ext
之下,这样在名令行下运行java-jarA.jar就可以。
但这样,我们需要在JRE留下一大坨东西,看起来似乎不太好看。
之二,看Java文档说,manifest文件中还有个属性叫做Class-Path,在A.jar的manifest中加上一句:
Class-Path:B.jar
重新打包。B.jar和A.jar在一个路径下,这样相对路径不变的话,B.jar会被ClassLoader照顾到。运行
java-jarA.jar
果然通过!这似乎还不错,我们可以把我们的软件做好,所有的功能分散在各个Jar文件中,但不能动任何一个Jar文件,相对路径一变,还是不行。而且,每一个Jar文件之间要算好相对路径,每一个都要配置Class-Path,晕也晕死。
一个未完成的想法,看了看Eclipse的文件结构,有一个单独的launcher来启动整个Eclipse。launcher就是一个Jar文件,其中的manifest并没有写Class-Path,它也能够调用plugins目录下的诸多组件来完成Eclipse的启动,运作。它是如何做的呢?Launcher中似乎重写了Classloader,可惜弄不到它的源代码,秘密也许就在classloader中。
更多推荐
所有评论(0)