java-j内的引用罐
我有一个罐子,其内容如下图所示,
下面是我的清单文件
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_06-b24 (Oracle Corporation)
Main-Class: org.sai.com.DerbyDemo
Class-Path: derby.jar derbyclient.jar derbynet.jar derbytools.jar
当我尝试运行广口瓶时,它抛出了2690040574979343343360,这表示它没有引用外部广口瓶中的广口瓶。
在2690040574979343343属性中,如何在实际的jar中引用jar(derby.jar等)?
7个解决方案
35 votes
为此,您将需要一个自定义的类加载器,看看One Jar。
通过One-JAR,您可以将Java应用程序及其依赖项Jar打包到一个可执行的Jar文件中。
它有一个蚂蚁任务,它也可以简化它的构建。
参考(背景)
大多数开发人员合理地假设将依赖项Jar文件放入其自己的Jar文件中,并向META-INF / MANIFEST添加Class-Path属性将达到目的:
jarname.jar
| /META-INF
| | MANIFEST.MF
| | Main-Class: com.mydomain.mypackage.Main
| | Class-Path: commons-logging.jar
| /com/mydomain/mypackage
| | Main.class
| commons-logging.jar
不幸的是,这是行不通的。 Java Launcher$AppClassLoader不知道如何使用这种Class-Path从Jar中的Jar中加载类。尝试使用jar:file:jarname.jar!/commons-logging.jar也会导致死胡同。 仅当将支持的Jar文件安装(即散布)到安装jarname.jar文件的目录中时,此方法才有效。
epoch answered 2020-01-06T02:11:12Z
22 votes
你不能 从官方教程:
通过在清单中使用Class-Path标头,可以避免 在调用Java来运行your时指定一个long -classpath标志 应用。
注意:Class-Path标头指向该目录中的类或JAR文件。 本地网络,而不是JAR文件中的JAR文件或可访问的类 通过互联网协议。 在JAR内的JAR文件中加载类 文件放入类路径,您必须编写自定义代码以加载那些 类。 例如,如果MyJar.jar包含另一个名为 MyUtils.jar,您不能在MyJar.jar的 清单以将MyUtils.jar中的类加载到类路径中。
JB Nizet answered 2020-01-06T02:11:42Z
13 votes
在Eclipse中,您可以选择导出可执行jar。
您可以选择将所有与项目相关的jar打包到生成的jar中,并通过eclipse添加自定义类加载器,该加载器将引用您在新jar中集成的jar。
vogash answered 2020-01-06T02:12:06Z
6 votes
classloader的默认实现无法从jar-in-a-jar进行加载:为此,必须将整个“ sub-jar”加载到内存中,这抵消了jar格式的随机访问优势( 参考待定-找到支持此操作的文档后,我将进行编辑。
我建议使用JarSplice之类的程序将所有内容捆绑到一个干净的可执行jar中。
编辑:找不到源引用,但这是Sun网站上尚未解决的RFE,描述了这个确切的“问题”:[http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4648386]
另外,您可以通过将库jar文件放在classes目录的269004273672362424960子目录中,然后从命令行运行,来“测试”程序是否正常运行。 换句话说,具有以下目录结构:
classes/org/sai/com/DerbyDemo.class
classes/org/sai/com/OtherClassFiles.class
classes/lib/derby.jar
classes/lib/derbyclient.jar
在命令行中,导航到上述“ classes”目录,然后键入:
java -cp .:lib/* org.sai.com.DerbyDemo
bfishman answered 2020-01-06T02:12:45Z
2 votes
将jar文件添加到您的库中(如果使用netbeans),并修改清单文件classpath,如下所示:
Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar lib/derbytools.jar
这里有一个类似的答案
BWGathecha answered 2020-01-06T02:13:09Z
1 votes
如果您不想创建自定义类加载器。 您阅读了jar文件流。 并将其传输到File对象。 然后,您可以获取文件的网址。 将其发送到URLClassLoader,您可以根据需要加载jar文件。样品:
InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("example"+ ".jar");
final File tempFile = File.createTempFile("temp", ".jar");
tempFile.deleteOnExit(); // you can delete the temp file or not
try (FileOutputStream out = new FileOutputStream(tempFile)) {
IOUtils.copy(resourceAsStream, out);
}
IOUtils.closeQuietly(resourceAsStream);
URL url = tempFile.toURI().toURL();
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});
urlClassLoader.loadClass()
...
蜡笔小新 answered 2020-01-06T02:13:30Z
-1 votes
在eclipse中,右键单击项目,选择RunAs-> Run Configuration并保存您的运行配置,这将在下次导出为Runnable JAR时使用。
Ziyi Wang answered 2020-01-06T02:13:50Z