我曾经遇到同样的问题,然后我写了一个ant任务来自动复制所有包含在类库项目中的依赖库到我的主项目中。这个方法不需要包含任何第三方库。
在类库项目选项中设置 Copy Dependent Libraries 复选框以使其生效。然后Netbeans会将所有依赖库复制到类库项目的 dist/lib 文件夹中,与 Gregory 的解决方案 类似。这种方法的优点是,当你向主项目中添加更多的类库时,你无需每次都修改你的 build.xml 文件。
工作原理
我的 ant 任务首先会在主项目属性中搜索所有包含的项目的路径,然后打开它们的 project.properties 文件,读取类库项目的 dist 文件夹并将所有库复制到 dist 文件夹的 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">
<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>
<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}">
</fileset>
</copy>
</sequential>
</macrodef>
</project>
在
<import file="nbproject/build-impl.xml"/>
后面,在build.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版本中测试过。希望这在未来的版本中仍然有效。