Как можно, чтобы Netbeans автоматически копировал сторонние jar-файлы из включенной библиотеки классов в каталог dist / lib моего проекта? - PullRequest
12 голосов
/ 06 февраля 2012

У меня есть приложение Java в NetBeans 7.1 (назовем его myApp), которое зависит от проекта библиотеки классов Java [более одного), где я храню некоторые служебные классы, которыми я делюсь между проектами.

Этот проект библиотеки классов (назовем его myLib) зависит от [многих] сторонних библиотек (например, apache-commons-younameit.jar).

Я включил myLib в качестве библиотеки, а Ant-скрипт NetBeans извлекает myLib.jar в каталог dist/lib моего проекта myApp; однако файлы jar, от которых зависит myLib, не извлекаются вместе с myLib, поэтому мой проект получает исключения во время выполнения из-за отсутствия apache-commons-youtnameit.jar.

Я бы хотел, чтобы myLib.jar и apache-commons-younameit.jar автоматически загружались в папку myApp dist/lib, чтобы мне не приходилось вручную проверять все зависимости моих библиотек и добавлять их в мой основной проект.

  • Есть ли очевидный способ сделать это с помощью диалогов NetBeans, которые мне не хватает?
  • или нужно вручную настроить мой build.xml? Если да, не могли бы вы опубликовать пример? (Я не очень хорошо разбираюсь в муравьях)

Что бы я хотел избежать , это следующее:

  1. Мне нужно добавить новую служебную библиотеку, выбирая из моих проектов библиотеки классов Java.
  2. Я смотрю в библиотеки этой библиотеки, какие jar-файлы используются, и записываю их.
  3. Я возвращаюсь к своему основному проекту и добавляю эти сторонние библиотеки (только те, которые я не включил для непосредственного использования из основного проекта).

Заранее спасибо за любую помощь или за то, что указали мне правильное направление.

Ответы [ 5 ]

9 голосов
/ 06 августа 2013

Я нашел способ скопировать «зависимые библиотеки - зависимые библиотеки», как вы сказали в одном из комментариев.Надеюсь, это поможет.

Добавьте следующий код в файл build.xml вашего проекта NetBean после строки <import file="nbproject/build-impl.xml"/>.Вам нужно будет указать правильный относительный путь в тегах <fileset> ниже.

<!--Copy over any "dependant libraries' dependant libraries" -->
<target name="-post-jar">
    <echo>Copying over extra jars into PROJECTNAME</echo>
    <copy todir="./dist/lib">
        <!-- put in order from least important to most important to prevent file overwrites -->
        <fileset dir="path-to-other-nb-project/dist/lib"></fileset>
        <fileset dir="path-to-second-nb-project/dist/lib"></fileset>
    </copy>
</target>

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

5 голосов
/ 10 октября 2013

Это то, что у меня работало в Netbeans 7.3:

Щелкните правой кнопкой мыши свой проект и выберите «Свойства», затем выберите «Библиотеки» справа.кнопка «Обзор ...»: Properties dialog

Затем выберите папку lib, если она не была автоматически выбрана Netbeans: Add Libraries Folder dialog

Затем нажмите Далее, Готово, если необходимо, икогда вы вернетесь в диалоговое окно «Свойства», вы должны иметь: Properties dialog final Setup

После этого Netbeans должен скопировать папку lib в dest и, что наиболее важно, сослаться на все ваши библиотеки в файле MANIFEST.MFв вашем основном JAR.

В качестве теста посмотрите, есть ли новая папка CopyLibs в папке lib.Внутри CopyLibs должен быть файл org-netbeans-modules-java-j2seproject-copylibstask.jar.Netbeans добавил их, и это, я полагаю, то, что приводит к копированию папки lib в dist.

3 голосов
/ 03 февраля 2015

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

Флажок Копировать зависимые библиотеки в параметрах проекта библиотеки классов должен быть установлен, чтобы это работало. Затем Netbeans копирует все зависимые библиотеки в папку dist / lib проекта библиотеки классов, аналогично решению Грегори . Преимущество этого метода в том, что когда вы включаете больше библиотек классов в основной проект, вам не нужно каждый раз адаптировать build.xml .

Как это работает

Моя задача ant сначала ищет в свойствах основного проекта пути всех включенных проектов, затем открывает их файл project.properties , читает папку dist проекта библиотеки классов и копирует все библиотеки в Каталог lib dist-folder в папку lib основного проекта.

Существует также проверка, если Копировать зависимые библиотеки включен.

код

Файл build-import-library.xml в родительской папке проекта:

<?xml version="1.0" encoding="UTF-8"?>
 <!--
      Custom import of libraries.
      This is not done in Netbeans, because the dist folder is created at runtime.

      To work correctly, disable the compile on save feature for your project.

      Author: Christophe Weis
 -->
<project name="IncludeLibraries" default="default" basedir=".">
    <description>Includes dependent libraries in projects using class-library projects.</description>
    <dirname property="IncludeLibraries.basedir" file="${ant.file.IncludeLibraries}"/>
    <target name="copy-files">
        <!-- Set variable to the folder where to copy the files to -->
        <condition property="libdestdir" value="${build.web.dir}/WEB-INF/lib" else="${dist.dir}/lib">
            <isset property="build.web.dir"/>
        </condition>
        <echo message="Custom build step in file '${ant.file}': copying dependent libraries from included Netbeans projects to '${libdestdir}'" level="info"/>
        <echo message="Please make sure that 'Copy Dependent Libraries' is enabled in Netbeans project options for each included project" level="info"/>
        <copy-dependent-libs>
            <propertyset id="properties-starting-with-project">
                <propertyref prefix="project."/>
            </propertyset>
        </copy-dependent-libs>
    </target> <!-- End custom import -->

    <scriptdef name="copy-dependent-libs" language="javascript">
        <element name="propertyset" type="propertyset"/>
        <![CDATA[
            // Ant uses the Rhino JavaScript implementation

            propertySets = elements.get("propertyset");
            // loop all nested property sets
            for (i = 0; i < propertySets.size(); ++i) {
                propertySet = propertySets.get(i);
                properties = propertySet.getProperties();
                for (var iterator = properties.entrySet().iterator(); iterator.hasNext();) {
                    var entry = iterator.next();
                    var key = entry.getKey();
                    if ("project.licensePath".equals(key)) {
                        continue;
                    }
                    var value = entry.getValue();

                    // read the referenced project's property file
                    var file = new java.io.File(project.getBaseDir(), value + "/nbproject/project.properties");
                    var inputStream = new java.io.FileInputStream(file);
                    var projectProperties = new java.util.Properties();
                    projectProperties.load(inputStream);
                    inputStream.close();
                    var distFolder = projectProperties.getProperty("dist.dir");

                    // check if 'Copy Dependent Libraries' is enabled
                    var doNotCopyDependentLibraries = projectProperties.getProperty("mkdist.disabled");
                    doNotCopyDependentLibraries = java.lang.Boolean.parseBoolean(doNotCopyDependentLibraries);
                    if (doNotCopyDependentLibraries) {
                        self.fail("Please enable 'Copy Dependent Libraries' in project properties for project " + projectProperties.getProperty("application.title", value));
                    }

                    t = project.createTask("copy-files-from-libfolder");
                    // set the dist folder's lib directory
                    t.setDynamicAttribute("fromdir", value + "/" + distFolder + "/lib");
                    t.perform();
                }
            }
        ]]>
    </scriptdef>

    <macrodef name="copy-files-from-libfolder">
        <attribute name="fromdir" />
        <sequential>
            <echo message="Copying libraries from directory '@{fromdir}' to '${libdestdir}'" level="verbose" />
            <copy todir="${libdestdir}">
                <fileset dir="@{fromdir}">
                    <!-- Enable this if you wish
                    <exclude name="servlet-api.jar"/>
                    -->
                </fileset>
            </copy>
        </sequential>
    </macrodef>

</project>

Включите эту строку в свой build.xml после <import file="nbproject/build-impl.xml"/> (вам может понадобиться адаптировать путь к build-import-library.xml в задаче импорта):

<!-- 
     Custom import of libraries.
-->
<import file="../build-import-libraries.xml" as="include-libraries" />
<target name="-post-compile" depends="include-libraries.copy-files" />

Это работает для приложений Java SE и веб-приложений Java. Я только что проверил это в Netbeans версии 8.0.2. Я надеюсь, что это будет работать в будущих версиях.

1 голос
/ 26 января 2013

Ответ Ли работает с проектом Java-приложения в NetBeans 7.2. Если вы хотите использовать Maven в NetBeans, вам придется создать проект Java-приложения Maven. Измените файл pom.xml, добавив в него подключаемый модуль maven :

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>your.app.MainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
0 голосов
/ 20 августа 2012

Предполагается, что вы добавили их все в путь к классам вашего проекта (под Libraries в свойствах проекта).Вы можете войти в Build > Packaging и поставить галочку Copy Dependant Libraries.

Я использую Netbeans 7.2.

...