从Own Jar项目调用Jar库?

时间:2011-05-28 09:46:47

标签: java jar

我用java编写了一个应用程序并将其转换为执行jar文件,我的项目依赖于“jxl.jar”。 有没有办法将“jxl.jar”复制到我的jar文件中,然后调用它。

我认为这叫做“嵌套罐子”?!?

非常感谢

最诚挚的问候,

麦克

3 个答案:

答案 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还会让你拥有同一个库的多个版本(在不同的名称空间中)。您可以将其与Antfrom the CLI一起使用。