2013-03-06 4 views
3

Моя цель - получить приложение Enterprise Java, которое будет создано на Jenkins. Приложение состоит из 4 проектов (Client-Interfaces, Webapplcation (включая лица), приложения EJB (включая JPA), EAR-Container-Project).Eclipse с Java EE (EJB), ANT и Jenkins/Hudson

Когда Eclipse развертывает эти проекты на сервере Glassfish, он собирает Web-приложение (war-file), клиент-интерфейсы (jar-файл) и EJB-интерфейсы (jar-файл) в один файл уха.

Теперь, если я хочу использовать непрерывную интеграцию, мне нужно добиться того же самого на джикинках CI-сервера.

Моя первая идея состояла в том, чтобы решить это с помощью ant, поэтому я использовал Export-Function Eclipse и сгенерировал build-Files для проектов.

Проблема заключается в том, что сгенерированные файлы сборки ссылаются на библиотеки Java EE (такие как Glassfish-Runtime, JPA-Library и т. Д.), Которые находятся за пределами каталога проекта. Существует около 30 библиотек.

Это означает, что я не могу использовать файл на jenkins, потому что эти библиотеки отсутствуют. Конечно, я могу их скопировать, но я не думаю, что так оно и должно быть.

Итак, что является лучшим способом заставить Java EE Enterprise Application быть построенным на CI-сервере? Должен ли я сам писать ANT-Script и копировать библиотеки в проект? Или я пропустил что-то очевидное?

ответ

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

Это очень хороший файл ant, который вы можете создать, вы можете легко интегрироваться с jenkins, но как запустить тесты? Вы можете попробовать использовать встроенный сервер приложений или попробовать запустить тесты в качестве внешнего приложения. –

0

Использование Maven.
Maven позволяет определить все зависимости в одном файле xml (pom), зависимости, которые будут автоматически загружены из Интернета на этапе компиляции.
Maven поставляется с набором плагинов для облегчения непрерывной интеграции, например, с возможностью запуска контейнера, запуска теста и автоматического закрытия. Maven интегрируется изначально с дженкинсами.
Maven определяет сложный жизненный цикл, разработанный для такого рода проблем и позволяющий скомпилировать, выполнить единичный тест, пакет, выполнить интеграционный тест и развернуть с помощью одной команды, запускаемой из jenkins;

Maven является окончательно решением здесь.

+0

Обратите внимание, что если 4 разных проекта, которые зависят друг от друга, вам придется упаковать их в общий родительский проект, который ссылается на все подпроекты. (мультимодульный проект maven).Вероятно, вам придется установить и настроить сервер nexus, чтобы предоставить вам свои артефакты (все банки, войну, ухо, которые являются результатом вашей проектной упаковки) механизму зависимости maven (только общие артефакты инфраструктуры отображаются в публичном репозитории maven) – Gab

+0

Хотя я пришел к выводу, что maven будет лучшим решением для этого, я не могу переключиться на maven из-за среды разработки в нашем университете. – Manuel

0

Вы можете также автоматически создать build.xml в Eclipse, используя «Экспорт ...> Общие \ Ant Buildfile "из контекстного меню проекта. Таким образом, правильный путь класса генерируется для вашего JAR, уже доступного в проекте.

Скорее всего, если есть зависимости между проектами, вам нужно только настроить один файл сборки, который будет запущен на Jenkins, так как он будет автоматически вызывать файлы сборки из других проектов.

Смежные вопросы