3

我的目标是在 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 并将库复制到项目中吗?还是我错过了一些明显的东西?

4

3 回答 3

4

由于我没有找到适合我的东西,我自己编写了一个 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>

`

于 2013-04-19T17:07:56.653 回答
0

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

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

于 2013-03-06T14:29:36.097 回答
0

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

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

于 2013-12-27T09:05:42.937 回答