如何让Netbeans自动将第三方JAR从包含的类库复制到我的项目';s dist/lib目录?

如何让Netbeans自动将第三方JAR从包含的类库复制到我的项目';s dist/lib目录?,netbeans,jar,dependency-management,class-library,netbeans-7.1,Netbeans,Jar,Dependency Management,Class Library,Netbeans 7.1,我在NetBeans 7.1中有一个Java应用程序(我们称之为myApp),它依赖于一个Java类库项目[实际上不止一个],在这个项目中我保存了一些在项目之间共享的实用程序类 这个类库项目(我们称之为myLib)依赖于[许多]第三方库(例如apachecommons younameit.jar) 我将myLib作为一个库包含在内,NetBeans的Ant脚本将myLib.jar拉入myApp项目的dist/lib目录中;但是,myLib所依赖的jar并没有与myLib一起拉入,因此我的项目会由

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

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

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

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

  • 有没有一种明显的方法可以通过我缺少的NetBeans对话框来实现这一点?
  • 还是有必要手动调整my build.xml?如果是这样的话,你能举个例子吗?(我对Ant不太了解)
我想避免的是:

  • 我需要添加一个新的实用程序库,从我的Java类库项目中挑选
  • 我查那个图书馆的图书馆用的是什么罐子,然后把它们写下来
  • 我回到我的主项目,添加那些第三方库(只有那些我还没有包含在主项目中直接使用的库)

  • 提前感谢您的帮助,或者为我指明了正确的方向。

    假设您已经将它们全部添加到项目类路径中(在项目属性的
    库下)。您可以进入
    Build>Packaging
    并勾选
    Copy dependent Libraries


    我使用的是Netbeans 7.2。

    Lee的答案适用于Netbeans 7.2中的Java应用程序项目。如果您想在NetBeans中使用Maven,就必须创建一个Maven Java应用程序项目。修改pom.xml文件以包括:

    
    maven汇编插件
    2.4
    带有依赖项的jar
    你的.app.main类
    组装
    包裹
    单一的
    
    我找到了一种复制“依赖库的依赖库”的方法,正如您在其中一条评论中所说的。希望这能有所帮助

    将以下代码添加到NetBean项目的build.xml文件中,
    行之后。您需要在下面的
    标记中填写正确的相对路径

    <!--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>
    
    
    将多个JAR复制到PROJECTNAME中
    

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

    这就是我在Netbeans 7.3中的工作原理:

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

    然后在“库文件夹”下单击“浏览…”按钮:

    然后选择您的lib文件夹,除非Netbeans已自动选择该文件夹:

    然后单击“下一步”,根据需要完成,当您返回“属性”对话框时,您应该:

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


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

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

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

    工作原理 我的ant任务首先在主项目的属性中搜索所有包含项目的路径,然后打开它们的project.properties文件,读取类库项目的dist文件夹,并将dist文件夹的lib目录中的所有库复制到主项目的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'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中的
    之后包含此行(您可能需要在导入任务中调整build-import-libraries.xml的路径):

    
    

    这适用于JavaSE应用程序和JavaWeb应用程序。我只在Netbeans 8.0.2版中测试过这一点。我希望这将在未来的版本中继续工作。

    如果您能够将jar文件放入项目jar文件中,您将使用什么程序来读取这些内部jar文件?我认为java命令不知道如何读取jar文件中包含的jar文件。@Rakesh嗨,我不需要
    <?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>
    
    <!-- 
         Custom import of libraries.
    -->
    <import file="../build-import-libraries.xml" as="include-libraries" />
    <target name="-post-compile" depends="include-libraries.copy-files" />