作者:BB15107669916 | 来源:互联网 | 2023-09-17 12:07
具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。-Xbootclasspatha:在系统class加载后加载。然后测试运行,一切正常!注意使用相
java命令执行jar包的方式是众所周知的。 可以将Java APP应用程序项目打包到jar中。 当然,您必须指定包含main函数的main class作为此jar包的程序入口。
具体方法是修改jar包中目录META-INF下的MANIFEST.MF文件。
例如,有一个名为test.jar的jar包。 那里有一个带有主函数的主类: test.some class name
在MANIFEST.MF中添加以下语句:
main-class : test.some class name
然后,可以通过在控制台中输入java-jartest.jar来运行此jar。
但是,我们的项目需要引用其他第三方的jar包。 在eclipse中以项目jar包的形式引用了这个名为some.jar的包。 被放在项目的lib子目录下。 在最后一个项目包时还注入了此some.jar,但是在java-jar中运行此test.jar时没有发现Class异常
那么怎么办?
可以采用在运行时将其添加到classpath的方式吗? 在运行jar的同时添加classpath参数。
Java-class path some.jar-jar test.jar
用这个方法不行。 由于使用classpath指定的jar由AppClassloader加载,因此如果将-jar参数添加到java命令中,AppClassloader将只关注test.jar中的class
我该怎么引用其他的jar包?
纯真的天空、使用Bootstrap Classloader来加载这些类
在运行时可以使用以下参数:
-Xbootclasspath:完全取代了系统Javaclasspath。 最好不要用。
-Xbootclasspath/a:在加载系统类后加载。 一般都用这个。
-Xbootclasspath/p:在加载系统类之前加载。 使用时请注意。 如果和系统类冲突就不好了。
win32 Java-xbootclass path/a : some.jar; some2.jar; -jartest.jar
UNIX Java-xbootclasspath/a : some.jar : some2. jar :-jar test.jar
win32系统上的每个jar用分号分隔,unix系统下用冒号分隔
yjfdsp、使用Extension Classloader来加载
您可以将需要加载的jar丢弃在%JRE_HOME%/lib/ext下。 此目录下的jar包将在Bootstrap Classloader完成后由扩展类loader加载。 很方便,很安心。 )
方法三、还是用AppClassloader来加载,不过不需要classpath参数了
将以下代码添加到MANIFEST.MF中:
Class-Path: lib/some.jar
lib是与test.jar相同目录的子目录,test.jar引用的some.jar包位于此处。
然后测试执行,一切正常!
如果需要引用多个jar包:
class-path : lib/some.jar lib/some2. jar
用空格分隔各个jar就可以了。 请注意,使用相对路径。
此外,如果META-INF包含INDEX.LIST文件,则Class-Path配置可能无效。 INDEX.LIST是打包Jar打包工具时生成的索引文件,删除不会影响其执行。
方法四、自定义Classloader来加载
此方法是最终解决方案,基本上tomcat、jboss等著名的Java APP应用程序就是这样做的。
这种方式有点复杂,需要特意贴上来讨论。 有关ClassLoader的原理和自定义ClassLoader的信息,请参见此http://Cui Xiaodong 214.blog.163.com/blog/static/95163982009135859761
总结:
这四种方法都可以使用。 特别是当程序在非常简单的环境中运行时。 但是,在执行多任务、多个APP应用的环境中,每个APP应用期望是独立的,而第一个和第二个场景可能影响其他APP应用,因此期望选择第三和第四个。
实战一分快三三期必中jar丢弃在%JRE_HOME%/lib/ext下。 此目录下的jar包将在Bootstrap Classloader完成后由扩展类loader加载。 很方便,很安心。 )
方法三、还是用AppClassloader来加载,不过不需要classpath参数了
将以下代码添加到MANIFEST.MF中:
Class-Path: lib/some.jar
lib是与test.jar相同目录的子目录,test.jar引用的some.jar包位于此处。
然后测试执行,一切正常!
如果需要引用多个jar包:
class-path : lib/some.jar lib/some2. jar
用空格分隔各个jar就可以了。 请注意,使用相对路径。
此外,如果META-INF包含INDEX.LIST文件,则Class-Path配置可能无效。 INDEX.LIST是打包Jar打包工具时生成的索引文件,删除不会影响其执行。
方法四、自定义Classloader来加载
此方法是最终解决方案,基本上tomcat、jboss等著名的Java APP应用程序就是这样做的。
这种方式有点复杂,需要特意贴上来讨论。 有关ClassLoader的原理和自定义ClassLoader的信息,请参见此http://Cui Xiaodong 214.blog.163.com/blog/static/95163982009135859761
总结:
这四种方法都可以使用。 特别是当程序在非常简单的环境中运行时。 但是,在执行多任务、多个APP应用的环境中,每个APP应用期望是独立的,而第一个和第二个场景可能影响其他APP应用,因此期望选择第三和第四个。