Jakarta ee Maven2:企业项目最佳实践(EAR文件)
我正在从Ant切换到Maven,并试图找出建立基于EAR文件的企业项目的最佳实践 假设我想创建一个相当标准的项目,其中包含用于EJB的jar文件、用于Web层的WAR文件和封装的EAR文件,以及相应的部署描述符 我该怎么做呢?使用war文件创建带有Jakarta ee Maven2:企业项目最佳实践(EAR文件),jakarta-ee,maven-2,ear,maven-ear-plugin,Jakarta Ee,Maven 2,Ear,Maven Ear Plugin,我正在从Ant切换到Maven,并试图找出建立基于EAR文件的企业项目的最佳实践 假设我想创建一个相当标准的项目,其中包含用于EJB的jar文件、用于Web层的WAR文件和封装的EAR文件,以及相应的部署描述符 我该怎么做呢?使用war文件创建带有archetypeArtifactId=maven-archetypewebapp的项目,并从那里扩展?这方面的最佳项目结构(以及POM文件示例)是什么?您将ear文件相关的部署描述符等放在哪里 谢谢你的帮助 创建一个新项目。新项目是EAR组装项目,它
archetypeArtifactId=maven-archetypewebapp
的项目,并从那里扩展?这方面的最佳项目结构(以及POM文件示例)是什么?您将ear文件相关的部署描述符等放在哪里
谢谢你的帮助 创建一个新项目。新项目是EAR组装项目,它包含EJB项目和WAR项目的两个依赖项 实际上,这里有三个maven项目。一个EJB。一场战争。一只耳朵,将两部分拉在一起,形成耳朵 部署描述符可以由maven生成,也可以放在EAR项目结构的resources目录中 maven-ear插件是您用来配置它的,它很好,但如果您仍然了解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>
4.0.0
com.mycompany
迈尔
耳朵
我的耳朵
maven编译器插件
1.5
1.5
UTF-8
maven耳朵插件
1.4
com.mycompany
我的战争
我的华纳时代战争
/myWarConext
com.mycompany
myEjb
MyEjbNameinthear.jar
我的耳朵名称显示在应用程序服务器中
真的
maven资源插件
2.3
UTF-8
我的名字
com.mycompany
我的战争
1.0-快照
战争
com.mycompany
myEjb
1.0-快照
ejb
这是一部分
您还可以检查作为示例提供的。如果您只是运行mvn原型:generate,您将获得可用原型的列表。其中之一是
maven-archetype-j2ee-simple
我一直在到处寻找一个完整的基于maven的ear打包应用程序的端到端示例,最后偶然发现了它。说明中说,在运行CLI时选择选项2,但出于您的目的,请使用选项1。对我帮助很大的是运行Maven原型:生成目标并从其中一个原型中进行选择,其中一些似乎定期更新(特别是JBoss似乎维护良好) 数以百计的原型出现在一个编号的列表中,可以从中进行选择(目前为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项(截至今天):
我选择了“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
NetBeans IDE自动定义的结构与Patrick Garner建议的结构几乎相似。对于NetBeans用户 文件->新建项目->在左侧选择Maven,在右侧选择Maven企业应用程序,然后按下一步->询问war、ejb和设置的项目名称
IDE将自动为您创建结构。我制作了一个github存储库,以展示我认为良好(或最佳实践)的启动项目结构 一些关键词:
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
------------------------------------------------------------------------
- 马文3
- BOM(依赖项管理自己的依赖项)
- 所有项目的父级(外部依赖项的依赖项管理和全局项目配置的插件管理)
- JUnit/Mockito/DBUnit
- 清理没有WEB-INF/lib的War项目,因为依赖项位于EAR/lib文件夹中
- 清洁耳朵项目
- Java EE7的最小部署描述符
- 没有本地EJB接口,因为@LocalBean已经足够了
- 通过maven用户属性进行的最小maven配置
- Servlet3.1/EJB3.2/JPA2.1的实际部署描述符
- 使用macker maven插件检查架构规则
- 已启用集成测试,但已跳过。(skipITs=false)可用于在CI生成服务器上启用
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
------------------------------------------------------------------------
一年后,当我有同样的问题时,我找到了自己的答案。干得好!对我来说,当我将
类型设置为ejb
ejb
时,pom会抛出一些警告:'build.plugins.plugin.version'用于org.apache.maven.plugin.plugin.plugin.plugin.plugins:maven-ear插件缺失
,org.apache.maven.plugins:maven编译器插件缺失
,因此,您可能希望更新其他方面的优秀答案这是可行的,但它确实会在您的项目中加入一堆jboss特定的依赖项,您可能希望也可能不希望在事后清理这些依赖项。maven-archetype-j2ee-simple
在结构上似乎不必要地复杂,尤其是模块中的模块,还有一些单独的模块,比如日志记录。我不理解这种结构背后的原理。我同意你的观点,特别是在遵守JEE6规范时。我非常喜欢你的包装和架构方法。你应该想想
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
------------------------------------------------------------------------