【问题标题】:Eclipse with Java EE (EJB), ANT and Jenkins / HudsonEclipse 与 Java EE (EJB)、ANT 和 Jenkins / Hudson
【发布时间】:2013-02-21 06:25:38
【问题描述】:

我的目标是在 Jenkins 上构建企业 Java 应用程序。该应用程序由 4 个项目(客户端接口、Webapplcation(包括 Faces)、EJB 应用程序(包括 JPA)、EAR-Container-Project)组成。

当 Eclipse 将此项目部署到 glassfish 服务器时,它会将 Web 应用程序(war 文件)、客户端接口(jar 文件)和 EJB 接口(jar 文件)组装到一个耳文件中。

现在,如果我想使用持续集成,我需要在 CI-Server jenkins 上实现相同的功能。

我的第一个想法是用 ant 解决这个问题,所以我使用了 Eclipse 的 Export-Function 并为项目生成了 build-Files。

问题是生成的构建文件引用了项目目录之外的 Java EE 库(例如 Glassfish-Runtime、JPA-Library 等)。大约有 30 个图书馆。

这意味着我无法在 jenkins 上使用该文件,因为缺少此库。我当然可以复制这些,但我认为不应该这样做。

那么,在 CI 服务器上构建 Java EE 企业应用程序的最佳方法是什么?我必须自己编写 ANT-Script 并将库复制到项目中吗?还是我遗漏了一些明显的东西?

【问题讨论】:

    标签: eclipse jakarta-ee ant jenkins ejb-3.0


    【解决方案1】:

    由于没有找到适合我的东西,我自己编写了一个 ant 脚本来满足我的需求。

    如果这对将来的任何人有帮助,这是我的解决方案: `

    <project basedir="." default="build" name="Project">
    
    <available property="glassfishdir" value="/opt/glassfish3/glassfish/modules" 
             file="/opt/glassfish3/glassfish/modules" type="dir" />
    
    <!-- ########### Property Declarations ###################################################################################################################  -->
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>
    <property name="builddir" value="build" />
    <property name="outputartifacts" value="out" />
    
    <property name="web.name" value="ProjectWeb" />
    <property name="web.projectpath" value="ProjectWeb"/>
    <property name="web.src" value="${web.projectpath}/src" />
    <property name="web.builddir" value="${builddir}/web" />
    <property name="web.builddir.classes" value="${web.builddir}/WEB-INF/classes"/>
    
    <property name="ejb.name" value="ProjectEJB" />
    <property name="ejb.projectpath" value="ProjectEJB"/>
    <property name="ejb.src" value="${ejb.projectpath}/src"/>
    <property name="ejb.builddir" value="${builddir}/ejb" />
    <property name="ejb.builddir.classes" value="${ejb.builddir}/classes" />
    
    <property name="ejbclient.name" value="ProjectEJBClient" />
    <property name="ejbclient.projectpath" value="ProjectEJBClient"/>
    <property name="ejbclient.src" value="${ejbclient.projectpath}/src"/>
    <property name="ejbclient.builddir" value="${builddir}/ejbclient" />
    <property name="ejbclient.builddir.classes" value="${ejbclient.builddir}/classes"/>
    
    <property name="ear.name" value="ProjectApplication" />
    <property name="ear.dir" value="ProjectEAR" />
    
    <!-- ########### Main Targets ###################################################################################################################   -->
    <target name="build" depends="create-ear">
    </target>
    
    <target name="clean-build">
        <antcall target="clean" />
        <antcall target="build" />
    </target>
    
    <target name="clean">
        <delete dir="${builddir}"/>
        <delete dir="${outputartifacts}"/>
    </target>
    
    <target name="init">
        <mkdir dir="${outputartifacts}" />
    </target>
    
    <!-- ########### EJB App ###################################################################################################################    -->
    <target name="init-ejb" depends="init">
        <mkdir dir="${ejb.builddir}" /> 
        <copy includeemptydirs="false" todir="${ejb.builddir.classes}">
            <fileset dir="${ejb.src}">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    <target name="build-ejb" depends="init-ejb">
        <javac debug="true" debuglevel="${debuglevel}" destdir="${ejb.builddir.classes}" includeantruntime="false" source="${source}" target="${target}">
            <src path="${ejb.src}"/>
            <classpath>
                <fileset dir="${glassfishdir}">
                    <include name="**/*.jar"/>
                </fileset>  
    
                <fileset dir="${outputartifacts}">
                    <include name="**/*.jar"/>
                </fileset>                  
            </classpath>
        </javac>
    </target>
    
    <!-- ########### WEB ###################################################################################################################    -->
    <target name="init-web" depends="init">
        <mkdir dir="${web.builddir.classes}"/>  
        <copy includeemptydirs="false" todir="${web.builddir}">
            <fileset dir="${web.projectpath}/WebContent">
            </fileset>
        </copy>
        <copy includeemptydirs="false" todir="${web.builddir.classes}">
            <fileset dir="${web.src}">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    
    <target depends="init-web,create-ejb-client" name="build-web">
        <javac debug="true" debuglevel="${debuglevel}" destdir="${web.builddir.classes}" includeantruntime="false" source="${source}" target="${target}">
            <src path="${web.src}"/>
            <classpath>
                <fileset dir="${glassfishdir}">
                    <include name="**/*.jar"/>
                </fileset>
                <fileset dir="out/">
                    <include name="**/*.jar"/>
                </fileset>  
            </classpath>
        </javac>
    </target>
    <!-- ############## EJB CLIENT ################################################################################################################ -->
    <target name="init-ejb-client" depends="init">
        <mkdir dir="${ejbclient.builddir}"/>
        <copy includeemptydirs="false" todir="${ejbclient.builddir.classes}">
            <fileset dir="${ejbclient.src}">
                <exclude name="**/*.java"/>
            </fileset>  
        </copy>
    </target>
    
    
    <target depends="init-ejb-client" name="build-ejb-client">
        <javac debug="true" debuglevel="${debuglevel}" destdir="${ejbclient.builddir.classes}" includeantruntime="false" source="${source}" target="${target}">
            <src path="${ejbclient.src}"/>
            <classpath>
                <fileset dir="${glassfishdir}">
                    <include name="**/*.jar"/>
                </fileset>          
            </classpath>
        </javac>
    </target>
    
    
    <!-- ############ CREATE ARCHIVES################################################################################################################## -->
    <target name="create-web" depends="build-web">
        <war destfile="${outputartifacts}/${web.name}.war" basedir="${web.builddir}" webxml="${web.projectpath}/WebContent/WEB-INF/web.xml"/>
    </target>
    
    <target name="create-ejb-client" depends="build-ejb-client">
        <jar destfile="${outputartifacts}/${ejbclient.name}.jar" basedir="${ejbclient.builddir.classes}" includes="**/*"/>
    </target>
    
    <target name="create-ejb" depends="build-ejb">
        <jar destfile="${outputartifacts}/${ejb.name}.jar" basedir="${ejb.builddir.classes}" includes="**/*">
            <manifest>
                <attribute name="Class-Path" value="${ejbclient.name}.jar"/>
            </manifest>
        </jar>
    </target>
    
    <target name="create-ear" depends="create-ejb-client,create-web,create-ejb">
        <ear destfile="${outputartifacts}/${ear.name}.ear" appxml="${ear.dir}/EarContent/META-INF/application.xml">
            <fileset dir="${outputartifacts}" includes="*.jar,*.war"/>
        </ear>
    </target>
    
    
    </project>
    

    `

    【讨论】:

    • 这是一个非常好的构建的ant文件,你可以轻松地与jenkins集成,但是如何运行测试呢?您可以尝试使用嵌入式应用程序服务器或尝试将测试作为外部应用程序运行。
    【解决方案2】:

    使用 Maven。
    Maven 允许在单个 xml 文件 (pom) 中定义所有依赖项,这些依赖项将在编译阶段自动从 Internet 下载。
    Maven 附带了一组插件来促进持续集成,例如能够启动容器、运行测试并自动关闭它。 Maven 与 jenkins 原生集成。
    Maven 定义了一个复杂的生命周期,专为此类问题而设计,并允许通过 jenkins 触发的单个命令编译、运行单元测试、打包、运行集成测试和部署;

    Maven 绝对是这里的解决方案。

    【讨论】:

    • 请注意,如果 4 个不同的项目相互依赖,您必须将它们打包在一个引用所有子项目的公共父项目中。 (多模块Maven项目)。您可能必须安装和配置一个 nexus 服务器,以允许将您自己的工件(所有 jar、war、ear 项目打包的结果)暴露给 maven 依赖机制(只有常见的框架工件暴露在 maven 公共存储库上)
    • 虽然我得出的结论是 maven 会是更好的解决方案,但由于我们大学的开发环境,我无法切换到 maven。
    【解决方案3】:

    您还可以使用项目上下文菜单中的“Export... > General\Ant Buildfile”在 Eclipse 中自动创建 build.xml。这样,正确的类路径就会生成到项目中已经可用的 JAR。

    如果项目之间存在依赖关系,您只需配置一个构建文件即可在 Jenkins 上运行,因为它会自动调用其他项目的构建文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-08
      • 2019-07-08
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多