Как я могу включить внешний JAR на мой проект NetBeans

Когда я запускаю "очистить и построить" .jar создаваемый файл запускается только в том случае, если lib папка находится в той же папке .jar файл.

Поэтому, если я переместу файл jar на рабочий стол и оставлю lib папка в dist папку, файл JAR даст мне исключение.

Как я могу справиться с этой проблемой?

12 ответов

Решение

Если вы скопируете ваши файлы jar в каталог с исходным кодом, они будут в вашем последнем файле. Тем не менее, я не уверен, будет ли это работать 100% времени.

На java-форуме есть отличный пост, в котором говорится следующее:

За исключением нескольких обстоятельств, для меня лучше всего просто объединить файлы вручную..Jar - это в основном.zip с упорядоченным содержимым, и вы можете открыть его практически в любой архивной программе с поддержкой.zip (я просто использую стандартный архиватор gnome File Roller, и он отлично работает). Сделайте резервную копию вашего файла JAR и откройте его в архиваторе по вашему выбору, и сделайте то же самое для каждого файла JAR в каталоге библиотеки. Перетащите рабочие папки (т. Е. Все, кроме каталога META-INF) из каждой библиотеки в корневой каталог вашего jar-файла (вместе с вашим META-INF и корневым пакетом приложения). Теперь перетащите файл META-INF/MANIFEST.MF из фляги на рабочий стол или в любую другую папку. Откройте его и сотрите строки Class-Path и X-COMMENT. Не забудьте оставить пустой символ новой строки в конце файла! Сохраните новый файл манифеста и перетащите его обратно в каталог META-INF вашего jar, перезаписав старый. Проверьте банку.

Я решил эту проблему, создав только один файл jar со всеми библиотеками внутри, добавив следующее в мой файл build.xml в NetBeans:

<target name="-post-jar">
  <jar jarfile="dist/Combined-dist.jar">
    <zipfileset src="${dist.jar}" excludes="META-INF/*" />
    <zipfileset src="lib/commons-io-1.4.jar" excludes="META-INF/*" />
    <zipfileset src="lib/ninja-utils-3.2.jar" excludes="META-INF/*" />
    <zipfileset src="lib/unicorn-1.0.jar" excludes="META-INF/*" />
    <manifest>
        <attribute name="Main-Class" value="com.example.mypackage.Main"/>
    </manifest>
  </jar>
</target>

Это создает файл jar (Combined-dist.jar), который является комбинацией dist jar и указанных библиотечных jar (в данном случае, commons-io-1.4.jar, ninja-utils-3.2.jar и unicorn-1.0. банка). Вы должны быть уверены, что указали пакет Main Class для нового файла JAR, иначе он не запустится, когда вы попытаетесь открыть его.

Это действительно легко упаковать каждую зависимую библиотеку (*.jar) в один myProject.jar.

Просто следуйте этим шагам, и вы, наконец, упакуете каждую зависимую библиотеку в одну банку. Если вы используете NetBeans, тогда вы можете точно следовать или же вам нужно найти файл build.xml в файлах проекта.

Выполните следующие шаги для редактирования build.xml

1) Нажмите на Files tab в левой части панели проекта в NetBeans.

2) Дважды щелкните на build.xml файл и добавить эти строки в нем непосредственно перед </project> линия

 <target name="package-for-store" depends="jar">
    <property name="store.jar.name" value="myProject"/>
    <property name="store.dir" value="store"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
    <delete dir="${store.dir}"/>
    <mkdir dir="${store.dir}"/>
    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
    <zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>
    <delete file="${store.dir}/temp_final.jar"/>
</target>

3) Изменить value во второй строке кода в соответствии с именем вашего проекта, который

<property name="store.jar.name" value="myProject"/> //<---Just value not name

4) Сохраните его и щелкните правой кнопкой мыши на build.xml и выберите " Запустить цель", затем " Другие цели" и, наконец, нажать " Пакет для магазина".

5) И вот вы сделали. Теперь вы можете пойти и проверить, как dist папка там будет store папка, которая будет содержать ваш окончательный полный JAR-файл, включая все ваши зависимые библиотеки. Теперь, когда вы хотите изменить / добавить больше библиотек или около того, просто выполните шаг 4.

Изображение для шага 4

Вы можете использовать Apache Ant начиная с версии 1.7 для сборки JAR с необходимыми библиотеками только в одном файле. Вы можете иметь файл конфигурации следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="buildJar">
    <target name="buildJar">
        <!-- Name of jar -->
        <jar destfile="C:/MyJar.jar" filesetmanifest="mergewithoutmain">
            <manifest>
                <!-- Your class with the main method -->
                <attribute name="Main-Class" value="myPackage.MyClass"/>
                <!-- Path in the jar -->
                <attribute name="Class-Path" value="."/>
            </manifest>
            <!-- Dir of compiled class -->
            <fileset dir="C:/NetBeansProjects/MyProject/bin"/>
            <!-- Include required jars -->
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library1.jar"/>
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library2.jar"/>
        </jar>
    </target>
</project>

В Netbeans поместите файл XML в свой проект и запустите его с помощью контекстного меню.

Подробнее см. В Руководстве пользователя Apache Ant.

Если вы собираетесь распространять свое приложение на другой компьютер

Вы просто архивируете.jar вместе с папкой lib.

Если вы хотите запустить ваше приложение из любого места на вашем компьютере

Возьмите в космический путь Maven способ сделать это - создать локальный репозиторий, например. C:\libs, где ваши библиотеки будут существовать, и.jar сможет получить к ним доступ позже из любого места на вашем компьютере.

Или вы можете просто использовать Maven. Существует обсуждение по распространению приложения со всеми зависимостями (библиотеками): Java: Как создать автономные дистрибутивы проектов на основе Maven?,

Скопируйте этот файл JAR в:

C: \ Program Files \ Java \ jdk \ jre \ lib \ ext

а также

C:\Program Files\Java\jre\lib\ext

Вы должны быть в состоянии использовать его в Netbeans и при ручном импорте, как при стандартном импорте.

Я нашел, возможно, самое простое решение этой проблемы здесь. Вам просто нужно скопировать следующий фрагмент кода в конце build.xml файл в папке вашего проекта.

<target name="-post-jar">

    <!-- Change the value to the name of the final jar without .jar -->
    <property name="store.jar.name" value="MyJarName"/>

    <!-- don't edit below this line -->
    <property name="store.dir" value="dist"/>
    <property name="temp.dir" value="temp"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

    <delete dir="${temp.dir}"/>
    <mkdir dir="${temp.dir}"/>

    <jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <delete dir="${store.dir}"/>

    <zip destfile="${store.jar}">
        <zipfileset src="${temp.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>

    <delete dir="${temp.dir}"/>

</target>
  1. Перейдите к build.xml в корне вашего проекта и добавьте код прямо перед </project> тег в конце.

  2. Теперь измените значение первого поля свойства в качестве комментария и сохраните изменения.

  3. Отныне, каждый раз, когда вы чистите и собираете свой проект, полная папка с зависимостями будет создаваться в папке проекта dist

Вот что сработало для меня:

Я встроил функцию экспорта в Excel в свой проект. 2 внешних.jars, которые я использовал для этой цели, были jxl.jar end sx.jar

Распакуйте эти 2 баночки в папку (java классы), используя 7-Zip без каких-либо файлов META. Распакуйте ваш проект jar в ту же папку, в которой находится файл META.

Перепакуйте всю папку классов Java с помощью JARMaker, чтобы воссоздать ваш Project .jar в его исходную папку дистрибутива... и все - полная функциональность Excel.

Попробуйте это - в IDE Netbeans:

  1. Перейти в Инструменты -> Библиотеки
  2. В диалоговом окне, в левом нижнем углу нажмите "Новая библиотека", введите имя
  3. На правой стороне, нажмите "Добавить JAR/ Папка"
  4. Нажмите OK в правом нижнем углу
  5. Перезапустите IDE и проверьте.

Решение user1016588 работает для меня. Есть одна опечатка: эта строка должна быть zipfileset src="dist/lib/commons-io-1.4.jar" exclude ="META-INF/*"

Выполните следующие действия:- 1. Щелкните правой кнопкой мыши на проекте, открытом в редакторе NetBeans 2. Выберите свойства 3. Выберите библиотеки 4. Добавьте JAR 5. Нажмите ОК

Вы также можете использовать это (когда библиотеки не находятся в "dist/lib"), протестировано с NetBeans и ant-contrib:

 <target name="-post-jar">
  <taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
   <!-- Path to ant-contrib -->
   <pathelement location="../../Libs/ant-contrib-1.0b3.jar"/>
    </classpath>
  </taskdef>

  <!-- Change the value to the name of the final jar without .jar -->
  <property name="store.jar.name" value="${application.title}"/>

  <!-- don't edit below this line -->
  <property name="store.dir" value="dist"/>
  <property name="temp.dir" value="temp"/>
  <property name="temp.libs.dir" value="temp/libs"/>
  <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

  <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
  
  <fileset id="store.jars.absolute" dir="${store.dir}" includes="*.jar"/>  
  <pathconvert property="store.jars.relative" refid="store.jars.absolute" dirsep="/">
   <map from="${basedir}/" to=""/>
  </pathconvert>
  
  <for list="${store.jars.relative}" param="item">
   <sequential>
    <echo message="Adding @{item} into single JAR at ${store.jar}"/>
   </sequential>
  </for>

  <delete dir="${temp.dir}"/>
  <mkdir dir="${temp.dir}"/>
  
  <for list="${javac.classpath}" param="item" delimiter=":">
   <sequential>
    <echo message="Adding @{item} into single JAR at ${store.jar}"/>
    <copy file="@{item}" todir="${temp.libs.dir}" overwrite="true" />
   </sequential>
  </for>

  <jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
   <zipgroupfileset dir="${store.dir}" includes="*.jar"/>
   <zipgroupfileset dir="${temp.libs.dir}" includes="*.*"/>

   <manifest>
    <attribute name="Main-Class" value="${main.class}"/>
   </manifest>
  </jar>

  <delete dir="${store.dir}"/>

  <zip destfile="${store.jar}">
   <zipfileset src="${temp.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
  </zip>

  <delete dir="${temp.dir}"/>

 </target>

Другие вопросы по тегам