2013-03-06 62 views
3

我的目标是让企业Java应用程序建立在Jenkins上。该应用程序由4个项目(客户端接口,Webapplcation(包括Faces),EJB应用程序(包括JPA),EAR-Container-Project)组成。Eclipse与Java EE(EJB),ANT和Jenkins/Hudson

当Eclipse将这些项目部署到glassfish服务器时,它将Webapplication(war-file),Client-Interfaces(jar-file)和EJB-Interfaces(jar-file)组装成一个ear-File。

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

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

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

这意味着我不能在jenkins上使用该文件,因为这些库缺失。当然,我可以复制这些,但我不认为这是应该如何完成的。

那么,在CI服务器上构建Java EE企业应用程序的最佳方式是什么?我是否必须自己编写ANT脚本并将这些库复制到项目中?或者我错过了一些明显的东西?

回答

3

因为我没有找到适合自己的东西,所以我写了一个蚂蚁脚本,它自己覆盖了我的需求。

这里是我的解决方案,如果这有助于在未来的人: `

<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> 

`

+0

这是一个非常好的蚂蚁文件构建,你可以轻松地与jenkins集成,但如何运行测试? 您可以尝试使用嵌入式应用程序服务器或尝试将测试作为外部应用程序运行。 – 2014-10-31 10:47:39

0

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

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

+0

请注意,如果4个不同项目相互依赖,则必须将它们打包在引用所有子项目的共同父项目中。 (多模块maven项目)。您可能需要安装和配置nexus服务器,以允许将自己的构件(包括项目打包的所有jar,war,ear)暴露给maven依赖机制(只有通用的框架构件在maven公共存储库上公开) – Gab 2013-03-06 14:33:29

+0

虽然我得出的结论是maven会是更好的解决方案,但由于我们大学的开发环境,我无法切换到maven。 – Manuel 2013-04-19 17:01:51

0

您还可以使用“导出自动创建在Eclipse中的build.xml ...>常规\ Ant Buildfile“。通过这种方式,正确的类路径将生成到项目中已有的JAR中。

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