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


100

我只是从Ant切换到Maven,并试图找出建立基于EAR文件的Enterprise项目的最佳实践?

假设我要创建一个非常标准的项目,其中包含用于EJB的jar文件,用于Web层的WAR文件和封装的EAR文件,以及相应的部署描述符。

我将如何处理?archetypeArtifactId=maven-archetype-webapp与war文件一样创建项目,并从那里扩展?最佳的项目结构(和POM文件示例)是什么?您将耳朵文件相关的部署描述符等放在哪里?

谢谢你的帮助。

Answers:


95

您创建一个新项目。新项目是您的EAR组装项目,其中包含您的EJB项目和WAR项目的两个依赖项。

因此,您实际上在这里有三个Maven项目。一个EJB。一战。一个将两个部分拉在一起并形成耳朵的EAR。

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

maven-ear-plugin是用于配置它的工具,文档很好,但是如果您仍然想弄清楚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>

98
一年后,当我遇到同样的问题时,我找到了自己的答案。自我做好!
Mike Cornell,2010年

1
对于我这个工作时,我设置typeejb <type>ejb</type>
gammay

该pom会发出一些警告:'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missing'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing,因此,您可能想更新您的其他好答案
DiegoAlfonso

46

对我帮助很大的是运行Maven原型:生成目标并从其中一种原型中进行选择,其中一些原型似乎会定期更新(特别是JBoss似乎维护良好)。

mvn archetype:generate

成百上千的原型出现在一个编号列表中供您选择(截至目前共有519个!)。该目标仍在运行,提示我通过输入数字或输入搜索字符串进行选择,例如:

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

我输入了搜索字符串“ ear”,将列表减少到仅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

我选择了“ org.jboss.spec.archetypes:jboss-javaee6-ear-webapp”(在此示例中输入选择“ 5”)。

接下来,目标要求我输入groupId,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

3
这行得通,但是最终确实将一堆特定于jboss的依赖项放到您的项目中,事实发生后您可能想要也可能不希望清理它们。
伊恩·麦克劳德

24

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

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

一些关键字:

  • Maven 3
  • BOM(自己的依赖项的DependencyManagement)
  • 所有项目的父项(来自外部依赖项的DependencyManagement和用于全局项目配置的PluginManagement)
  • JUnit / Mockito / DBUnit
  • 在没有WEB-INF / lib的情况下清理War项目,因为依赖项位于EAR / lib文件夹中。
  • 清洁耳朵项目。
  • Java EE7的最小部署描述符
  • 没有本地EJB接口,因为@LocalBean就足够了。
  • 通过Maven用户属性进行最少的Maven配置
  • Servlet 3.1 / EJB 3.2 / JPA 2.1的实际部署描述符
  • 使用macker-maven-plugin检查架构规则
  • 集成测试已启用,但已跳过。(skipITs = false)有助于在CI Build Server上启用

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

2
我非常喜欢您的包装和建筑方法。您应该考虑将项目打包为Maven原型。
约尔格2015年

2
非常好的解决方案!不过,我有一个问题:为什么不将BOM表内容打包到父项目中?为什么要增加层?
sschober

1
关注点分离的原因。物料清单可以由其他项目进口。他们只需要依赖项的dependencyManagement,而不需要您使用的依赖项的dependencyManagement。好。您可以说,如果没有人使用您的项目,那么这个额外的层就不是必须的。父项目的dependencyManagement不与你的依赖混合......在> 50个内部Maven项目一个更大的项目的父项目中的dependencyManagement可能是一团糟..
StefanHeimberg

2
另一个原因是,该结构与maven.apache.org/guides/introduction/…中记录的结构相同。这有助于在团队成员经常更改的团队中工作,因为这是“默认”的记录方式。
StefanHeimberg,2015年

2
顺便说一句。我曾经创建一个GitHub项目来展示如何完成多项目设置:github.com/StefanHeimberg/maven3-multiapplication-setup(用于公司内部讨论)
StefanHeimberg,2015年

7

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

文件 - > 新建项目 - >在左侧选择的Maven,并在右侧选择的Maven企业应用程序,并按下下一步 - >询问了两个战争,EJB和设置项目名称。

IDE将自动为您创建结构。


我同意您的意见,尤其是在遵守JEE6规范时-Sym
-Sym

3

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

您还可以检查作为示例的Maven原型。如果您只是欠缺mvn archetype:generate,则会获得可用原型的列表。其中之一是

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simple似乎在结构上不必要地复杂-尤其是模块内部的模块,以及用于日志之类的单独模块的模块。我不理解这种结构的理由
Vihung

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.