Как я могу включить внешний 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>
Перейдите к build.xml в корне вашего проекта и добавьте код прямо перед
</project>
тег в конце.Теперь измените значение первого поля свойства в качестве комментария и сохраните изменения.
Отныне, каждый раз, когда вы чистите и собираете свой проект, полная папка с зависимостями будет создаваться в папке проекта dist
Вот что сработало для меня:
Я встроил функцию экспорта в Excel в свой проект. 2 внешних.jars, которые я использовал для этой цели, были jxl.jar end sx.jar
Распакуйте эти 2 баночки в папку (java классы), используя 7-Zip без каких-либо файлов META. Распакуйте ваш проект jar в ту же папку, в которой находится файл META.
Перепакуйте всю папку классов Java с помощью JARMaker, чтобы воссоздать ваш Project .jar в его исходную папку дистрибутива... и все - полная функциональность Excel.
Попробуйте это - в IDE Netbeans:
- Перейти в Инструменты -> Библиотеки
- В диалоговом окне, в левом нижнем углу нажмите "Новая библиотека", введите имя
- На правой стороне, нажмите "Добавить JAR/ Папка"
- Нажмите OK в правом нижнем углу
- Перезапустите 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>