【问题标题】:How do I add a jar-file to Ant for a NetBeans Java Web App project so that it gets build on Jenkins?如何为 NetBeans Java Web App 项目添加一个 jar 文件到 Ant 以便它在 Jenkins 上构建?
【发布时间】:2026-01-25 10:55:01
【问题描述】:

正如我在 my previous question 中指出的那样,我正在尝试使用 Jenkins CI 为 NetBeans 多层 Web 应用程序项目设置一个自动构建系统。

我的 Ant 目标是 cleandebug。清理工作,但尝试编译项目时调试失败。

在我的 Jenkins 构建的输出中,我看到以下命令:

[PGB Webapp] $ cmd.exe /C '""C:\Program Files (x86)\Jenkins\tools\hudson.tasks.Ant_AntInstallation\Apache_Ant\bin\ant.bat" "-Dlibs. MySQLDriver.classpath=C:/Program Files (x86)/MySQL/MySQL Connector J/mysql-connector-java-5.1.31-bin.jar" "-Dlibs.CopyLibs.classpath=C:/Program Files/NetBeans 8.0/ java/ant/extra/org-netbeans-modules-java-j2seproject-copylibstask.jar" "-Dj2ee.server.home=C:/Program Files/wildfly-8.1.0.Final" clean debug && exit %%ERRORLEVEL% %"'

这是我输出的最后一部分:(对我来说似乎最重要的部分)

library-inclusion-in-manifest:

-do-compile:
    [mkdir] Created dir: C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\build\empty
    [mkdir] Created dir: C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\build\generated-sources\ap-source-output
    [javac] Compiling 2 source files to C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\build\web\WEB-INF\classes
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\config\ApplicationConfig.java:6: error: package javax.ws.rs.core does not exist
    [javac] import javax.ws.rs.core.Application;
    [javac]                        ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\config\ApplicationConfig.java:8: error: cannot find symbol
    [javac] public class ApplicationConfig extends Application {
    [javac]                                        ^
    [javac]   symbol: class Application
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:12: error: package javax.ws.rs does not exist
    [javac] import javax.ws.rs.GET;
    [javac]                   ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:13: error: package javax.ws.rs does not exist
    [javac] import javax.ws.rs.Path;
    [javac]                   ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:14: error: package javax.ws.rs does not exist
    [javac] import javax.ws.rs.PathParam;
    [javac]                   ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:15: error: package javax.ws.rs does not exist
    [javac] import javax.ws.rs.QueryParam;
    [javac]                   ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:16: error: package javax.ws.rs does not exist
    [javac] import javax.ws.rs.Produces;
    [javac]                   ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:17: error: package javax.ws.rs.core does not exist
    [javac] import javax.ws.rs.core.MediaType;
    [javac]                        ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:19: error: cannot find symbol
    [javac] @Path("/employees")
    [javac]  ^
    [javac]   symbol: class Path
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:29: error: cannot find symbol
    [javac]     public List<Employee> find(@QueryParam("name") String name) {
    [javac]                                 ^
    [javac]   symbol:   class QueryParam
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:27: error: cannot find symbol
    [javac]         @GET
    [javac]          ^
    [javac]   symbol:   class GET
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:28: error: cannot find symbol
    [javac]     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    [javac]      ^
    [javac]   symbol:   class Produces
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:38: error: cannot find symbol
    [javac]     public Employee findById(@PathParam("id") String id) {
    [javac]                               ^
    [javac]   symbol:   class PathParam
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:36: error: cannot find symbol
    [javac]     @GET @Path("{id}")
    [javac]      ^
    [javac]   symbol:   class GET
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:36: error: cannot find symbol
    [javac]     @GET @Path("{id}")
    [javac]           ^
    [javac]   symbol:   class Path
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:37: error: cannot find symbol
    [javac]     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    [javac]      ^
    [javac]   symbol:   class Produces
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:44: error: cannot find symbol
    [javac]     public List<Employee> findByManager(@PathParam("id") String managerId) {
    [javac]                                          ^
    [javac]   symbol:   class PathParam
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:42: error: cannot find symbol
    [javac]     @GET @Path("{id}/reports")
    [javac]      ^
    [javac]   symbol:   class GET
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:42: error: cannot find symbol
    [javac]     @GET @Path("{id}/reports")
    [javac]           ^
    [javac]   symbol:   class Path
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\rest\EmployeeResource.java:43: error: cannot find symbol
    [javac]     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    [javac]      ^
    [javac]   symbol:   class Produces
    [javac]   location: class EmployeeResource
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\config\ApplicationConfig.java:17: error: method does not override or implement a method from a supertype
    [javac]     @Override
    [javac]     ^
    [javac] C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\src\java\com\edw\config\ApplicationConfig.java:22: error: method does not override or implement a method from a supertype
    [javac]     @Override
    [javac]     ^
    [javac] 22 errors

BUILD FAILED
C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\nbproject\build-impl.xml:208: The following error occurred while executing this line:
C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\nbproject\build-impl.xml:881: The following error occurred while executing this line:
C:\Program Files (x86)\Jenkins\workspace\PGB Webapp\pgb-war\nbproject\build-impl.xml:297: Compile failed; see the compiler error output for details.

Total time: 1 second
Build step 'Start Ant' marked build as failure
Finished: FAILURE

嗯,重要的是 Java 编译器无法找到 RESTful Web 服务库。我在 C:/Program Files/wildfly-8.1.0.Final/modules/system/layers/base/javax/ws/rs/api/main/jaxrs-api-3.0.8 找到了我需要的 jar。 Final.jar.

我没有使用 Ant 构建工具的经验,因此我搜索并找到了很多关于它的信息,但我似乎无法弄清楚如何添加此库以便项目在 Jenkins 上正确构建。

目前我的 build.xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project name="pgb" default="default" basedir="." xmlns:ear="http://www.netbeans.org/ns/j2ee-earproject/2">
    <description>Builds, tests, and runs the project pgb.</description>
    <import file="nbproject/build-impl.xml"/>

    <taskdef resource="net/jtools/classloadertask/antlib.xml">
      <classpath>
        <fileset dir="${basedir}/lib" includes="ant-classloader*.jar"/>
      </classpath>
    </taskdef>

    <!--Add jar to the classpath-->
    <classloader loader="system">
      <classpath>
        <fileset dir="${basedir}/lib" includes="jboss-modules.jar"/>
        <fileset dir="${basedir}/lib" includes="jaxrs-api-3.0.8.Final.jar"/>
      </classpath>
    </classloader>
</project>

文件 build-impl.xml(已导入)由 NetBeans 生成(您可能已经知道)并且太大而无法在此处显示,此外我无法更改任何内容,因为系统可能会自动更改该文件自己。

无论如何,如您所见,我尝试使用在这里找到的 Ant 类加载器:https://*.com/a/5116470/2541501 但是没有运气。我什至将所需的 jar 文件添加到项目的 lib 目录中。

所以,我的问题是:如何更改我的 Ant 构建脚本,以便 Java 编译器不会抱怨缺少包(即缺少 jar 文件)?

我还担心,如果我将任何目标添加到我的 build.xml 文件中,它可能会与生成的 build-impl.xml 文件中声明的任何内容发生冲突。有人也知道这方面的吗?

【问题讨论】:

    标签: java netbeans ant jenkins restful-architecture


    【解决方案1】:

    好吧,我的同事发现我们只需要将 NetBeans 项目的私有属性复制到我们项目的 Jenkins 作业的 Ant Invoke 的 Properties 字段中

    因此,我们的 NetBeans 项目在 nbproject 目录中有一个名为 private 的目录。在这个private 目录中有一个名为private.properties 的文件。我们从该文件中获取属性并将其复制到 Ant Invoke 的 Properties 字段中。现在我们的 Properties 字段如下所示:

    libs.CopyLibs.classpath=C:/Program Files/NetBeans 8.0/java/ant/extra/org-netbeans-modules-java-j2seproject-copylibstask.jar
    libs.MySQLDriver.classpath=C:/Program Files (x86)/MySQL/MySQL Connector J/mysql-connector-java-5.1.31-bin.jar
    
    j2ee.platform.is.jsr109=true
    j2ee.server.domain=C:/Wildfly/standalone
    j2ee.server.home=C:/Wildfly
    j2ee.server.instance=wildfly-deployer:localhost:8080#standalone&C:\\Wildfly
    

    现在我们可以毫无问题地执行所有 Ant 命令。我们还能够部署通过 Jenkins 构建的 Web 应用程序。

    如果有人想知道,可以在 WildFly 中找到 RESTful Web 服务。所以我们不需要直接包含 RESTful Web Services 的 jar,我们只需要正确设置 WildFly 服务器的属性即可。

    回想起来,我想说的是,为 NetBeans 项目设置具有自动构建的持续集成系统一点也不难。现在,下一步还包括对项目进行自动化测试。

    【讨论】:

      最近更新 更多