Вызов библиотеки Jar из собственного проекта Jar? - PullRequest
1 голос
/ 28 мая 2011

Я написал приложение с java и преобразовал его в исполняемый файл jar, мой проект зависит от "jxl.jar".Есть ли способ скопировать "jxl.jar" в мой файл jar и после этого вызвать его.

Я думаю, что это называется "Nested Jars"?!?

Большое спасибо

С наилучшими пожеланиями,

Майк

Ответы [ 3 ]

4 голосов
/ 28 мая 2011

Самый простой способ - распаковать jxl.jar и упаковать его в одну банку вместе с файлами классов.

Вы также можете положить jxl.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});

    }
}

К сожалению, он не работает с вложенными банками. URLClassLoader имеет проблемы с ними. Вы можете извлечь ваши вложенные файлы jar во временные файлы и передать их в URLClassLoader. Вы также можете использовать пользовательский URLStreamHandler, как описано здесь , это может быть даже рабочее решение.

2 голосов
/ 28 мая 2011

Нельзя вкладывать банки. Но вы можете поместить jxl.jar рядом с вашей флягой и добавить эту флягу как запись пути к классу в манифесте вашей фляги:

Class-Path: jxl.jar

Подробнее http://download.oracle.com/javase/tutorial/deployment/jar/downman.html.

1 голос
/ 28 мая 2011

Если ваш проект не использует несколько версий одной и той же библиотеки, вы можете сделать, как сказал Бантар, извлечь lib jar из файла jar и затем упаковать все заново.

Поскольку jar-файлы - это zip-файлы, вы можете использовать свое любимое программное обеспечение для сжатия файлов и скопировать классы из jxl.jar в свой. Вы также можете использовать команду jar:

Извлеките содержимое jxl.jar с помощью

jar xf jxl.jar

Скопируйте содержимое в выходной каталог (вместе со скомпилированными классами вашего проекта). Перепакуйте все:

jar cf my.jar my-build-directory

Еще один вариант - использовать jarjar . Помимо встраивания одного jar в другой, jarjar позволит вам иметь несколько версий одной и той же библиотеки (в разных пространствах имен). Вы можете использовать его с Ant или от CLI .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...