2012-05-31 2 views
22

Когда я запускаю «clean and build», файл .jar, который создается, запускается только в том случае, если папка lib находится в той же папке файла .jar.Как включить внешнюю банку в проект Netbeans

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

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

+0

erm, распространять каталог «lib» вместе с банкой? – Nim

+0

Нет, я не хочу этого делать. – ksm001

+2

Затем вы заставляете своих пользователей загружать банки зависимостей, если они хотят запустить ваше приложение. Выберите свой яд ... – Nim

ответ

12

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

Существует большой пост в java-forum, который гласит следующее:

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

3

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

Вы просто ZiP .jar вместе с Lib папки.

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

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

Или вы могли бы просто использовать Maven. Обсуждается распространение приложения со всеми зависимостями (библиотеками): Java: How do I build standalone distributions of Maven-based projects?.

5

Вы можете использовать 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 User Manual.

3

Понял банку файл:

C: \ Program Files \ Java \ JDK \ JRE \ Lib \ внутр

и

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

Вы должны иметь возможность использовать его в Netbeans и в вашем ma как и стандартный импорт.

23

Я решил эту проблему, создав только одну баночку файл со всеми библиотеками внутри, добавив следующую строку в мой файл 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> 

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

+1

Я добавил два примера к вашему примеру, чтобы показать, что вам нужно добавить одну строку для каждого банку, которую вы хотите включить.Я знаю, что вы можете использовать подстановочный знак, чтобы добавить весь каталог lib, но я не могу играть с ant прямо сейчас, поэтому я отправлю простейший пример (чтобы избежать публикации непроверенных _code_). Большое спасибо за этот ответ! – jahroy

+0

Просто отметим, что его нужно добавить непосредственно перед закрывающим тегом '' в 'build.xml'. –

+0

Что это говорит, что банка (например, вы Комбинированный-dist.jar) не существует, даже я ее создаю. Я тоже меняю пакет в <значение атрибута> – diegoaguilar

1

Это то, что работает для меня:

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

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

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

1

Решение user1016588 работает для меня. Там одна опечатка: эта линия должна быть zipfileset SRC = "расстояние/Lib/Обще-ю-1.4.jar" исключает = "META-INF/*"

1

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

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

Выполните следующие: - 1. Щелкните правой кнопкой мыши на проекте был открыт в редакторе Netbeans 2. выберите свойства 3. выбрать библиотекам 4. добавить баночку 5. ОК

8

щелчок Это очень легко упаковывайте каждую зависимую библиотеку (* .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, которая будет содержать вашу окончательную полную банку, включая все ваши зависимые библиотеки. Теперь, когда вы хотите изменить/добавить несколько библиотек или так, просто следуйте шаг 4.

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

enter image description here

1

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

Здесь мы идем:

<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, и добавьте код непосредственно перед закрывающим тегом проекта в конце.

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

  3. Нажмите кнопку Clean & Построить и ваша баночка будет находиться в DIST папке

+1

«Я разработал» ??? Это было опубликовано 6 лет назад, с почти такими же комментариями, Роберт Экштайн. http://www.oracle.com/technetwork/java/javamail/single-jar-141905.html –

+0

@MikeHousky Я отредактировал сообщение, чтобы отдать должное оригинальному автору. Это изменение было [отклонено] (http://stackoverflow.com/review/spected-edits/15808434), потому что «Это редактирование отменяет сообщение, чтобы продвигать продукт или услугу или намеренно разрушительно». Я, возможно, был введен в заблуждение в свое время на открытом воздухе. Там, где [атрибуция явно требуется] (https://outdoors.meta.stackexchange.com/q/725/8887) для скопированного материала. Здесь кажется, что атрибуция не просто не требуется, но активно запрещена и рассматривается как «разрушительная» :(. – Pont

0

Вы также можете использовать это (если библиотеки не в "расстояние/Lib"), протестирована с NetBeans и муравей-вно:

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

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

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

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

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

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

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

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

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

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

 
\t </target>

Смежные вопросы