(tng) (tng)
4Q?没有选择的出w?tng) (tng) (tng)?
(tng) (tng)
5Q?莫名其妙的孤独?tng) (tng) (tng)?
(tng) (tng)
6Q?无可奈何的遗忘?tng) (tng) (tng)?
(tng) (tng)
7Q?永远的过去?tng) (tng) (tng)?
(tng) (tng)
8Q?别h的嘲W?tng) (tng) (tng)?
(tng) (tng)
9Q?不可避免的死亡?tng) (tng) (tng)?
(tng) (tng)
10Q?不可救药的喜Ƣ?tng)?/p>
当用java -jar yourJarExe.jar来运行一个经q打包的应用E序的时候,你会(x)发现如何讄-classpath参数应用E序都找不到相应的第三方c,报ClassNotFound错误。实际上q是׃当?jar参数q行的时候,java VM?x)屏蔽所有的外部classpath,而只以本wyourJarExe.jar的内部class作ؓ(f)cȝL范围?/p>
**解决Ҏ(gu)**
一 BootStrap class扩展Ҏ(gu)
Java 命o(h)行提供了(jin)如何扩展bootStrap U别class的简单方?
-Xbootclasspath: (tng) (tng) (tng) (tng) (tng)完全取代基本核心(j)的Java class 搜烦(ch)路径.
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 不常?否则要重新写所有Java 核心(j)class
-Xbootclasspath/a: 后缀在核?j)class搜烦(ch)路径后面.常用!!
-Xbootclasspath/p: 前缀在核?j)class搜烦(ch)路径前面.不常?避免
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 引v不必要的冲突.
语法如下:
(tng)(分隔W与classpath参数cMQunix使用:?windows使用;Pq里以unixZ)
(tng)java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar
?extend class 扩展Ҏ(gu)
Java exten class 存放在{Java_home}\jre\lib\ext目录?当调用Java?Ҏ(gu)展class路径的搜索是自动?M(x)搜烦(ch)?q样,解决的方案就很简单了(jin),所有要使用的第三方的jar包都复制到ext 目录?
?User class扩展Ҏ(gu)
当?jar执行可执行Jar包时,JVMJar包所在目录设|ؓ(f)codebase目录,所有的class搜烦(ch)都在q个目录下开?所以如果用了(jin)其他W三方的jar?一个比较可以接受的可配|方?是利用jar包的Manifest扩展机制.
步骤如下:
(tng)1.需要的W三方的jar?复制在同可执行jar所在的目录或某个子目录? (tng)比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包复制到/usrhome目录下或/usrhome/lib {类似的子目录下.
(tng)2.修改Manifest 文g
(tng)在Manifest.mf文g里加入如下行
(tng)Class-Path:classes12.jar lib/thirdlib.jar
(tng)Class-Path 是可执行jar包运行依赖的关键?详细内容可以参考?a target="_blank" snap_preview_added="spa" snap_icon_added="spa" parent_link_icon="false">http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html (tng)。要注意的是 Class-Path 只是作ؓ(f)你本地机器的CLASSPATH环境变量的一个羃写,也就是说用这个前~表示在你的jar包执行机器上所有的CLASSPATH目录下寻扄应的W三方类/cd。你q不能通过 Class-Path 来加载位于你本n的jar包里面(或者网l上Q的jar文g。因Z理论上来Ԍ你的jar发布包不应该再去包含其他的第三方cdQ而应该通过使用说明来提醒用户去获取相应的支持类库)(j)。如果由于特D需要必L其他的第三方cdQjar, zip, class{)(j)直接打包在你自己的jar包里面一起发布,你就必须通过实现自定义的ClassLoader来按照自q意图加蝲q些W三方类库?/p>
Java的安全机刉不同的JDK版本有不同的变化,?x)?jing)响很多核?j)CLASS,比如Thread,所以很多大型商业Y?要求JDK的版本很严格.部分原因也在?q也要求在发布自q写的应用时?不管大小,都要说明开发和试的JDK版本.
---------------------------------------------------------------------------------------------- ?背景知识 自JDK 1.2以后,JVM采用?jin)委?delegate)模式来蝲入classQ采用这U设计的原因可以参?a target="_blank" snap_preview_added="spa" snap_icon_added="spa" parent_link_icon="false">http://java.sun.com/docs/books/tutorial/ext/basics/load.html 归纳来讲:是基于JVM sandbox(沙盒)安装模型上提供应用层的可定制的安全机?
1. Bootstrap classes 属于Java q_核心(j)的class,比如java.lang.String{??qing)rt.jar{重要的核心(j)U别的class.q是由JVM Bootstrap class loader来蝲入的.一般是攄在{java_home}\jre\lib目录?/p>
2. Extension classes ZJava扩展机制,用来扩展Java核心(j)功能模块.比如Java串口通讯模块comm.jar.一般放|在{Java_home}\jre\lib\ext目录?/p>
3. User classes 开发h员或其他W三方开发的JavaE序?通过命o(h)行的-classpath?cp,或者通过讄CLASSPATH环境变量来引?JVM通过攄在{java_home}\lib\tools.jar来寻扑֒调用用户U的class.常用的javac也是通过调用tools.jar来寻扄h定的路径来编译Java源程?q样引Z(jin)User class路径搜烦(ch)的顺序或优先U别的问? (tng)3.1 ~省?调用Java或javawa的当前\?.),是开发的class所存在的当前目?br /> (tng)3.2 CLASSPATH环境变量讄的\?如果讄?jin)CLASSPATH,则C(j)LASSPATH的g(x)覆盖~省?br /> (tng)3.3 执行Java的命令行-classpath?cp的?如果制定?jin)这两个命o(h)行参C一,它的g(x)覆盖环境变量CLASSPATH的?br /> (tng)3.4 -jar 选项:如果通过java -jar 来运行一个可执行的jar?q当前jar包会(x)覆盖上面所有的?换句话说,-jar 后面所跟的jar包的优先U别最?如果指定?jar选项,所有环境变量和命o(h)行制定的搜烦(ch)路径都将被忽?JVM APPClassloader只?x)以jar包ؓ(f)搜烦(ch)范围. q也是ؓ(f)什么应用程序打包成可执行的jar包后,不管你怎么讄classpath都不能引用到W三方jar包的东西?
以上三种Ҏ(gu)推荐W一U?/strong>Q扩展性好Q操作v来也最方便.
另外~写自己的ClassLoader,来动态蝲入class,是更加复杂和高技?限于幅,不赘q?有兴了(jin)解可以去google一下custom classloaderQ或者参考我的另一日志:(x)让classpath参数走开?/p>
本文所q方法测试基于j2sdk 1.4.2_04-b05
Java虚拟?JVM)LClass的顺?/p>
有关可执行jar有许多相关的安全斚w的描q?可以参?a target="_blank" snap_preview_added="spa" snap_icon_added="spa" parent_link_icon="false">http://java.sun.com/docs/books/tutorial/jar/ 来全面了(jin)?