Как я могу Netbeans автоматически копировать сторонние банки из включенной библиотеки классов в мой каталог dist/lib проекта?

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

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

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

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

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

Мне бы хотелось избегать:

  • Мне нужно добавить новую библиотеку утилиты, выбрав из моих проектов библиотеки классов Java.
  • Я просматриваю библиотеки библиотек, какие банки используются и записывают их.
  • Я возвращаюсь к своему основному проекту и добавляю те сторонние библиотеки (только те, которые я не включил уже для непосредственного использования из самого моего основного проекта).

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

Ответ 1

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

Добавьте следующий код в файл 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>

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

Ответ 2

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

Щелкните правой кнопкой мыши на своем проекте и выберите "Свойства", затем выберите "Библиотеки с правой стороны".

Затем в разделе "Папка библиотек" нажмите кнопку "Обзор...": Properties dialog

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

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

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

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

Ответ 3

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

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

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

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

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

Код

Файл build-import-libraries.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 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 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-libraries.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. Я надеюсь, что это продолжит работу в будущих версиях.

Ответ 4

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

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

Ответ 5

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

<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>