我用java编写了一个应用程序并将其转换为执行jar文件,我的项目依赖于“jxl.jar”。 有没有办法将“jxl.jar”复制到我的jar文件中,然后调用它。
我认为这叫做“嵌套罐子”?!?
非常感谢
最诚挚的问候,
麦克
答案 0 :(得分:4)
最简单的方法是解压缩jxl.jar
并将其与您的类文件一起打包到单个jar中。
您也可以将jxl.jar
放入jar中,使用JarClassLoader
加载并使用反射进行调用,但这可能不值得花费并添加复杂功能。
这应该是这样的:
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Preloader
{
public static void main(String[] args) throws Exception
{
Class<Preloader> c= Preloader.class;
URLClassLoader loader = new URLClassLoader(new URL[]{
c.getResource("program.jar"),
c.getResource("library.jar")});
Class<?> main_class=loader.loadClass("Main");
Method main_method = main_class.getMethod("main", args.getClass());
main_method.invoke(null, new Object[]{args});
}
}
不幸的是,它并不适用于嵌套的jar。 URLClassLoader
有问题。您可以将嵌套的jar解压缩到临时文件,并将它们传递给URLClassLoader。您也可以使用here所述的自定义URLStreamHandler
,它甚至可能是一个有效的解决方案。
答案 1 :(得分:2)
你无法嵌套罐子。但是你可以将jxl.jar放在你的jar旁边,并将这个jar作为一个类路径条目添加到你的jar的清单中:
Class-Path: jxl.jar
阅读http://download.oracle.com/javase/tutorial/deployment/jar/downman.html了解详情。
答案 2 :(得分:1)
如果您的项目不使用同一个库的多个版本,您可以像Banthar告诉的那样,在您的jar文件中解压缩lib jar然后重新打包所有内容。
由于jar文件是zip文件,因此您可以使用自己喜欢的文件压缩软件,并将类从jxl.jar复制到您的文件中。您也可以使用jar命令:
使用
提取jxl.jar的内容jar xf jxl.jar
将内容复制到输出目录(与项目的编译类一起)。重新包装一切:
jar cf my.jar my-build-directory
另一种选择是使用jarjar。除了将一个jar嵌入另一个jar之外,jarjar还会让你拥有同一个库的多个版本(在不同的名称空间中)。您可以将其与Ant或from the CLI一起使用。