14

我在 NetBeans 7.1 中有一个 Java 应用程序(我们称之为 myApp),它依赖于一个 Java 类库项目 [实际上不止一个],我在其中保留了一些我在项目之间共享的实用程序类。

这个类库项目(我们称之为 myLib)依赖于 [许多] 第三方库(例如 apache-commons-younameit.jar)。

我将 myLib 作为库包含在内,NetBeans 的 Ant 脚本将 myLib.jar 拉到dist/lib我的 myApp 项目目录中;但是,myLib 所依赖的 jar 没有与 myLib 一起拉入,因此我的项目由于缺少 apache-commons-youtnameit.jar 而出现运行时异常。

我想让 myLib.jar 和 apache-commons-younameit.jar 自动拉入 myApp 的dist/lib文件夹,这样我就不必手动检查所有库的依赖项并将它们添加到我的主项目中。

  • 有没有一种明显的方法可以通过我缺少的 NetBeans 对话框来实现这一点?
  • 还是有必要手动调整我的 build.xml?如果是这样,您能否发布一个示例?(我对 Ant 不太了解)

我想避免的是:

  1. 我需要添加一个新的实用程序库,从我的 Java 类库项目中挑选。
  2. 我查找该图书馆的图书馆使用了哪些罐子并将它们写下来。
  3. 我回到我的主项目并添加那些第 3 方库(只有那些我还没有包括在我的主项目本身中直接使用的库)。

预先感谢您的任何帮助,或为我指明正确的方向。

4

5 回答 5

10

正如您在其中一条评论中所说,我找到了一种复制“依赖库的依赖库”的方法。希望这会有所帮助。

将以下代码添加到 NetBean 项目的 build.xml 文件中的<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>

不是最干净的代码,但它为我解决了问题。当您向主项目添加额外的依赖项目时,您需要手动更新它。

于 2013-08-06T19:50:48.337 回答
5

这就是在 Netbeans 7.3 中对我有用的:

右键单击您的项目并选择属性,然后选择右侧的库。

然后在“库文件夹”下单击“浏览...”按钮: 属性对话框

然后选择您的 lib 文件夹,除非它已被 Netbeans 自动选择: 添加库文件夹对话框

然后单击下一步,根据需要完成,当您返回属性对话框时,您应该有: 属性对话框最终设置

之后,Netbeans 应该将 lib 文件夹复制到 dest,最重要的是,将引用主 JAR 中 MANIFEST.MF 文件中的所有库。

作为测试,看看 lib 文件夹中是否有新的 CopyLibs 文件夹。在 CopyLibs 内应该有一个 org-netbeans-modules-java-j2seproject-copylibstask.jar 文件。Netbeans 添加了这些,我想这就是将 lib 文件夹复制到 dist 的原因。

于 2013-10-10T12:06:45.443 回答
3

我遇到了同样的问题,我编写了一个 ant 任务来自动将所有包含的类库项目中的依赖库复制到我的主项目中。您无需包含任何第三方库即可运行。

必须设置类库项目选项中的Copy Dependent Libraries复选框才能使其正常工作。然后 Netbeans 将所有依赖库复制到类库项目的dist/lib文件夹中,类似于Gregory 的解决方案。这种方法的优点是,当您在主项目中包含更多类库时,您不需要每次都调整您的build.xml 。

这个怎么运作

我的 ant 任务首先在主项目的属性中搜索所有包含项目的路径,然后打开它们的project.properties文件,读取类库项目的 dist 文件夹并将 dist 文件夹的 lib 目录中的所有库复制到 main-项目的 lib 文件夹。

如果启用了Copy Dependent Libraries,还有一个测试。

编码

项目父文件夹中的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'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-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 Web 应用程序。我只在 Netbeans 8.0.2 版中对此进行了测试。我希望这将在未来的版本中继续工作。

于 2015-02-03T07:37:25.050 回答
1

Lee 的回答适用于 NetBeans 7.2 中的 Java 应用程序项目。如果要在 NetBeans 中使用 Maven,则必须创建一个 Maven Java 应用程序项目。修改 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>
于 2013-01-26T01:36:13.727 回答
0

假设您已将它们全部添加到项目类路径中(Libraries在项目属性下)。你可以进去Build > Packaging打勾Copy Dependant Libraries

我正在使用 Netbeans 7.2。

于 2012-08-20T11:13:46.670 回答