我遇到了同样的问题,我编写了一个 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 版中对此进行了测试。我希望这将在未来的版本中继续工作。