Подтвердить что ты не робот

NetBeans - развертывание всех в одной банке

Возможный дубликат:
Поместить внешнюю библиотеку в JAR?

У меня есть NetBeans 6.8, и я написал один класс, который имеет две библиотеки (jar файлы). Построим его, я получаю папку "dist" с моим файлом project.jar и "lib", которая содержит два файла jar jar.

Как я могу получить все это в одном файле jar? (Я не использую Maven/ Ant или что-то вроде этого.)

4b9b3361

Ответ 1

Основная проблема заключается в том, что текущая версия Java не поддерживает jars внутри jars из коробки.

Рекомендуемое решение - использовать строку Class-Path в файле MANIFEST.MF внутри вашего баннера, чтобы указать на нужные библиотеки (допустимы относительные пути), а затем развернуть все файлы вместе и вызвать его с помощью "java -jar your. банка"

Если вы действительно хотите иметь решение "jar-inside-jar", мы использовали один барабан в течение нескольких лет, но ушли от него, так как наша целевая JVM работала лучше с решением, описанным выше.

http://one-jar.sourceforge.net/

Я использовал его с плагином fatjar в Eclipse. У меня нет опыта в создании его в Netbeans, но его легко встраивать в ant script, который, я считаю, является тем, что NEtbeans использует в любом случае.

Ответ 2

Вы можете создать дополнительную цель сборки в файле build.xml. И используйте zipfileset и zipgroupfileset для создания одной большой банки например.

<target name="YourBigJar" depends="-post-jar">
  <jar destfile="BigJar.jar">
    <zipfileset src="dist/Project1.jar"/>
    <zipfileset src="../OtherProject/dist/project2.jar"/>
    <zipgroupfileset dir="../libs/."/>
  </jar>
</target>

Ответ 3

Я согласен с Вавериком. Самый простой способ сделать это с помощью NetBeans - добавить пользовательскую цель в ваш build.xml. (Кстати, благодаря использованию NetBeans вы используете Ant, так как NetBeans использует Ant для создания файла jar.)

Цель Waverick Ant, как представляется, предназначена для объединения скомпилированного кода из другого проекта NetBeans в текущий файл jar проекта. Мои цели ниже делают именно то, что вы ищете.

<target name="-unjar-and-copy-lib-jars">
    <unjar dest="${build.classes.dir}">
        <fileset dir="lib">
            <include name="**/*.jar"/>
        </fileset>
        <patternset>
            <exclude name="META-INF/**"/>
            <exclude name="/*"/>
        </patternset>
    </unjar>
</target>

<target depends="init,compile,-pre-pre-jar,-pre-jar,-unjar-and-copy-lib-jars" name="fat-jar">
    <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
    <jar destfile="${dist.jar}">
        <fileset dir="${build.classes.dir}"/>
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
    <echo>To run this application from the command line without Ant, try:</echo>
    <property location="${dist.jar}" name="dist.jar.resolved"/>
    <echo>java -jar "${dist.jar.resolved}"</echo>
</target>

<target depends="clean,fat-jar" name="clean-and-fat-jar"/>

Ответ 4

Я нашел хорошую статью здесь. Но, кажется, стоит упомянуть, что он запрашивает внешние библиотеки в папке dest/lib. Вы можете сделать это, но обычно у нас есть папка lib в корневой папке (или у меня есть). Если это просто изменение

<zipgroupfileset dir="dist/lib" includes="*.jar"/> to

<zipgroupfileset dir="/lib" includes="*.jar"/>. 

Что все.

Ответ 5

Вы можете использовать Java для программной установки внешних библиотек с помощью Class.getResourceAsStream() и FileOutputStream. Библиотеки обычно входят в Java\lib\ext\.

Вот как я подошел к нему:

Я поместил копию всего JAR, который я использовал в подпакет .res. Оттуда я могу их скопировать в любом месте.

private void installLibraries() {
    new Thread() {

        @Override
        public void run() {
            System.out.println("Checking for libraries");

            File jre = new File(System.getProperty("java.home"));
            File jar = new File(jre, "lib/ext/JAR_NAME.jar");
            //Create more File objects that wrap your JAR's
            try {
                boolean added = false;

                if (!jar.exists()) {
                    copyResource(jar, "JAR_NAME.jar");
                    added = true;
                }
                //Repeat for more JAR's

                if (added) {
                    System.out.println("Libraries installed.");
                } else {
                    System.out.println("Library check complete");

            } catch (IOException ex) {
                System.out.println("Library installation failed.");
                ex.printStackTrace(System.out);
            }
        }

        private void copyResource(File dest, String src) throws IOException {
            System.out.println("Copying resource " + src + " to " + dest);
            InputStream in = THIS_CLASS_NAME.class.getResourceAsStream("/YOUR_PACKAGE/res/" + src);
            dest.getParentFile().mkdirs();
            FileOutputStream out = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int i = 0;
            while ((i = in.read(buffer)) > 0) {
                out.write(buffer, 0, i);
            }
            out.close();
            in.close();
        }
    }.start();
}

Запустите этот метод, прежде чем делать что-либо еще, и вы можете полностью игнорировать внешние файлы JAR, которые Netbeans дает вам, и просто распределить их. В качестве дополнительной заметки я использовал этот метод для установки javax.comm, который не нравился, когда он был распространен извне. Он поставляется с файлом .dll и файлом свойств. Эти файлы могут быть установлены с использованием одного и того же метода, но стоит отметить, что файл .dll должен быть помещен в каталог Java\lib\, а файлы свойств находятся в каталоге Java\lib\ (не в папке \ext).