Maven2:企业项目的最佳实践(EAR文件)

我只是从Ant切换到Maven,并试图找出build立基于EAR文件的企业项目的最佳做法?

比方说,我想用EJB的jar文件,Web层的WAR文件和封装的EAR文件,以及相应的部署描述符创build一个非常标准的项目。

我将如何去呢? 使用archetypeArtifactId=maven-archetype-webapp创build项目与war文件一样,并从那里扩展? 什么是最好的项目结构(和POM文件的例子)呢? 你在哪里粘贴ear文件相关的部署描述符等?

谢谢你的帮助。

你创build一个新的项目。 新项目是您的EAR程序集项目,它包含您的EJB项目和WAR项目的两个依赖关系。

所以你在这里实际上有三个maven项目。 一个EJB。 一个战争。 一个把两部分拉在一起,形成耳朵的EAR。

部署描述符可以由maven生成,也可以放在EAR项目结构的resources目录中。

maven-ear-plugin是你用来configuration它的,而且文档是好的,但是如果你还在搞清楚maven是如何工作的话。

所以作为一个例子,你可能会这样做:

 <?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>myEar</artifactId> <packaging>ear</packaging> <name>My EAR</name> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-ear-plugin</artifactId> <configuration> <version>1.4</version> <modules> <webModule> <groupId>com.mycompany</groupId> <artifactId>myWar</artifactId> <bundleFileName>myWarNameInTheEar.war</bundleFileName> <contextRoot>/myWarConext</contextRoot> </webModule> <ejbModule> <groupId>com.mycompany</groupId> <artifactId>myEjb</artifactId> <bundleFileName>myEjbNameInTheEar.jar</bundleFileName> </ejbModule> </modules> <displayName>My Ear Name displayed in the App Server</displayName> <!-- If I want maven to generate the application.xml, set this to true --> <generateApplicationXml>true</generateApplicationXml> </configuration> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.3</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <finalName>myEarName</finalName> </build> <!-- Define the versions of your ear components here --> <dependencies> <dependency> <groupId>com.mycompany</groupId> <artifactId>myWar</artifactId> <version>1.0-SNAPSHOT</version> <type>war</type> </dependency> <dependency> <groupId>com.mycompany</groupId> <artifactId>myEjb</artifactId> <version>1.0-SNAPSHOT</version> <type>ejb</type> </dependency> </dependencies> </project> 

帮助我很多的是运行Maven原型:生成目标并从其中一个原型中进行select,其中一些似乎定期更新(特别是JBoss似乎保持良好)。

 mvn archetype:generate 

数百个原型出现在编号列表中,从中select(现在是519个!)。 目标仍在运行,促使我通过input一个数字或input一个searchstring进行select,例如:

 513: remote -> org.xwiki.commons:xwiki-commons-component-archetype 514: remote -> org.xwiki.rendering:xwiki-rendering-archetype-macro 515: remote -> org.zkoss:zk-archetype-component 516: remote -> org.zkoss:zk-archetype-webapp 517: remote -> ru.circumflex:circumflex-archetype (-) 518: remote -> se.vgregion.javg.maven.archetypes:javg-minimal-archetype (-) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 

我input了searchstring“ear”,从而将列表减less到只有8个项目(截至今天):

 Choose archetype: 1: remote -> org.codehaus.mojo.archetypes:ear-j2ee14 (-) 2: remote -> org.codehaus.mojo.archetypes:ear-javaee6 (-) 3: remote -> org.codehaus.mojo.archetypes:ear-jee5 (-) 4: remote -> org.hibernate:hibernate-search-quickstart (-) 5: remote -> org.jboss.spec.archetypes:jboss-javaee6-ear-webapp 6: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype 7: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype-blank 8: remote -> org.ow2.weblab.tools.maven:weblab-archetype-searcher 

我select了“org.jboss.spec.archetypes:jboss-javaee6-ear-webapp”(在这个例子中input选项“5”)。

接下来,目标要求我inputgroupId,artifactId,包名等,然后生成以下完备的示例应用程序:

 [pgarner@localhost Foo]$ tree . |-- Foo-ear | `-- pom.xml |-- Foo-ejb | |-- pom.xml | `-- src | |-- main | | |-- java | | | `-- com | | | `-- foo | | | |-- controller | | | | `-- MemberRegistration.java | | | |-- data | | | | `-- MemberListProducer.java | | | |-- model | | | | `-- Member.java | | | `-- util | | | `-- Resources.java | | `-- resources | | |-- import.sql | | `-- META-INF | | |-- beans.xml | | `-- persistence.xml | `-- test | |-- java | | `-- com | | `-- foo | | `-- test | | `-- MemberRegistrationTest.java | `-- resources |-- Foo-web | |-- pom.xml | `-- src | `-- main | |-- java | | `-- com | | `-- foo | | `-- rest | | |-- JaxRsActivator.java | | `-- MemberResourceRESTService.java | `-- webapp | |-- index.html | |-- index.xhtml | |-- resources | | |-- css | | | `-- screen.css | | `-- gfx | | |-- banner.png | | `-- logo.png | `-- WEB-INF | |-- beans.xml | |-- faces-config.xml | `-- templates | `-- default.xhtml |-- pom.xml `-- README.md 32 directories, 23 files 

在阅读了四个POM文件之后,我得到了几乎所有我需要的信息。

 ./pom.xml ./Foo-ear/pom.xml ./Foo-ejb/pom.xml ./Foo-web/pom.xml 

我已经做了一个github存储库,以显示我认为是一个良好的(或最佳实践)启动项目结构…

https://github.com/StefanHeimberg/stackoverflow-1134894

一些关键字:

  • Maven 3
  • BOM(依赖关系的依赖pipe理)
  • 所有项目的父项(来自外部依赖项的依赖项pipe理和用于全局项目configuration的PluginManagement)
  • JUnit / Mockito / DBUnit
  • 清洁战争项目没有WEB-INF / lib,因为依赖关系在EAR / lib文件夹中。
  • 清洁耳朵项目。
  • Java EE7的最小部署描述符
  • 没有本地EJB接口,因为@LocalBean就足够了。
  • 通过maven用户属性最小的mavenconfiguration
  • Servlet 3.1 / EJB 3.2 / JPA 2.1的实际部署描述符
  • 使用macker-maven-plugin来检查架构规则
  • 集成testing启用,但跳过。 (skipITs = false)在CI构build服务器上启用有用

Maven输出:

 Reactor Summary: MyProject - BOM .................................... SUCCESS [ 0.494 s] MyProject - Parent ................................. SUCCESS [ 0.330 s] MyProject - Common ................................. SUCCESS [ 3.498 s] MyProject - Persistence ............................ SUCCESS [ 1.045 s] MyProject - Business ............................... SUCCESS [ 1.233 s] MyProject - Web .................................... SUCCESS [ 1.330 s] MyProject - Application ............................ SUCCESS [ 0.679 s] ------------------------------------------------------------------------ BUILD SUCCESS ------------------------------------------------------------------------ Total time: 8.817 s Finished at: 2015-01-27T00:51:59+01:00 Final Memory: 24M/207M ------------------------------------------------------------------------ 

NetBeans IDE自动定义与Patrick Garnerbuild议的结构几乎相似的结构。 对于NetBeans用户

文件 – > 新build项目 – >在左侧selectMaven和在右侧selectMaven企业应用程序 ,然后按下一步 – >要求战争,ejb和设置的项目名称。

IDE将自动为您创build结构。

我一直在寻找一个完整的,基于maven的ear-packaged应用程序的端到端示例,并最终陷入了困境。 说明说,select选项2时,通过CLI运行,但为了您的目的,使用选项1。

这是maven-ear-plugin部分的一个很好的例子 。

您也可以检查可用的maven原型作为示例。 如果你只是简单的mvn archetype:生成你会得到一个可用的原型列表。 其中之一是

 maven-archetype-j2ee-simple 
Interesting Posts