我目前正在探索构建绑定到TomEE服务器的Web应用程序,即它既可以作为TomEE中唯一的(附加)应用程序运行,也可以嵌入TomEE。该Web应用程序应支持Servlet和JSP(基本上,我们希望在此处使用Struts2)。
我尝试了几个选项,但都遇到了几个问题:
选项1:使用Maven-Shade-Plugin捆绑我们的应用程序,并按以下说明嵌入其中:http://www.tomitribe.com/blog/2015/03/50-shades-of-tomee/
问题:
1)部署捆绑的应用程序仅可通过--as-war
选项与7.x版本一起使用,但7.x尚未投入生产,我找不到任何计划的发布日期
2)部署JAXRS网络服务工作正常,但servlet不能。没有拾取web.xml,存在类加载问题等。
选项2:使用TomEE-Maven-Plugin构建一个包含tomee和我们的webapp的zip。
问题:
1)这仅适用于插件版本7.x(尚无法正式生产),但这不会影响生成的版本(基于TomEE 1.7.2)
2)存在库冲突,因为TomEE可能会加载一些由应用程序提供的库(在不同版本中)。
由于应用程序与服务器绑定在一起,反之亦然,因此可以将所有库都放置到TomEE的lib文件夹中,这可以通过将Maven插件指向依赖项下载到的文件夹来进行。这可以工作,但没有解决冲突的方法,即将库仅复制到目标文件夹。
我现在可以手动配置插件以删除每个有冲突的工件,但是随着应用程序以及潜在冲突库的数量的增长,这可能变得很麻烦。
选项3:与选项2相似,但不使用TomEE-Maven-Plugin。
我想应该可以使用预包装的TomEE和一些Maven插件来构建可分发的zip,这可以解决问题No。 1,但问题编号。 2-这是更大的-仍然存在:手动处理所有依赖项将很麻烦。
最后,问题是:我应该如何构建该应用程序?
我更愿意选择选项1,但是我还找不到任何有关如何使之工作的文档/示例/教程。
选项2和3也可以,但是我需要某种方法让Maven解决依赖冲突,而无需我检查每个依赖,尤其是传递性。
最佳答案
这个MySQL数据库应用程序类似于您描述的使用Maven处理依赖关系并加载启动时嵌入的tomee的应用程序。
public class Main {
public static void main(String[] args) {
String currentDir = null;
try {
currentDir = new File(".").getCanonicalPath();
LOG.info("Current application directory: " + currentDir);
} catch (IOException e) {
e.printStackTrace();
}
String war = currentDir + "\\target\\app.war";
String tomeeConf = currentDir + "\\src\\main\\tomee\\conf\\tomee.xml";
// ARGUMENTS
String[] setup = { "--path", war, "--tomeexml", tomeeConf };
try {
// PROGRAM:
org.apache.tomee.embedded.Main.main(setup);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Tomee嵌入式文档有点稀疏,因为它仍在开发中,并且很难获得有用的工作示例。配置具有挑战性,如果我不能赞扬Mark Struberg来帮助我启动和运行自己的程序,我将不为所动。
Tomee Embedded需要位于以下位置的配置文件:
src / main / tomee / tomee.xml:
<?xml version="1.0" encoding="UTF-8"?>
<tomee>
<!-- Connection details specified in src/main/resource/persistence.xml -->
<Resource id="APP-DATA" type="javax.sql.DataSource">
IgnoreDefaultValues true
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://localhost:3306/scc-data
UserName admin
Password pass
JtaManaged true
</Resource>
</tomee>
Tomee提供以下关键默认值:
默认值[Tomee配置类]
httpPort = 8080
stopPort = 8005
主机=“本地主机”
httpsPort = 8443
quickSession = true
但是,没有任何参数,apache-tomee目录设置为
每次运行时都将“ tomee-embedded_” + System.currentTimeMillis()+“ -home”]并将应用程序名称和路径设置为null,从而在localhost:8080处产生404错误。为了保持一致,请将目录设置为单个位置。
另外,Tomee默认使用OpenJPA作为JPA提供程序。当我开始开发时,Tomee 7.0.2使用了OpenJPA 2.4.1,它有一个有问题的未解决的错误[OPENJPA-2635 3/20/16],提示您切换到Hibernate。 (此错误可能已在7.0.3版中修复。)Tomee的加载过程显然在读取persistence.xml或tomee.conf之前将OpenJPA作为提供程序实现。为了防止过早加载OpenJPA,请添加到persistence.xml:
http://stackoverflow.com/questions/40818396/
还应将Hibernate添加到apache-tomee库,在我的情况下为hibernate-core.jar,位于F:\ theapp \ apache-tomee \ lib,其作用域设置为pom中提供的。
http://stackoverflow.com/questions/10852035/how-to-use-tomee-with-hibernate
请注意,Tomee 7.0.3实现了Tomcat 8.5.11和JavaEE 7并利用:
Java Servlet 3.1,JSF 2.2(myfaces 2.2.11),JSTL 1.2,JSP 2.3,
EL 3.0和JPA 2.1。
父pom:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>rfpeake</groupId>
<artifactId>theapp-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>theapp</name>
<description>Database project</description>
<modules>
<module>../theapp-app</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<tomee.version>7.0.3</tomee.version>
<tomee.classifier>webprofile</tomee.classifier>
<mysql-connector-version>5.1.40</mysql-connector-version>
<hibernate.version>5.2.9.Final</hibernate.version>
<primefaces.version>6.1</primefaces.version>
</properties>
<dependencies>
<!-- TOMEE EMBEDDED -->
<dependency>
<groupId>org.apache.tomee</groupId>
<artifactId>tomee-embedded</artifactId>
<version>${tomee.version}</version>
</dependency>
<!-- Declaration for JSF 2.2 with Tomee 7 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- JPA spec [required] -->
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jpa_2.0_spec</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
<scope>provided</scope>
</dependency>
<!-- Hibernate EHCache -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- Primefaces -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>${primefaces.version}</version>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
theapp-app pom:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>rfpeake</groupId>
<artifactId>theapp-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../theapp-parent/pom.xml</relativePath>
</parent>
<artifactId>theapp-app</artifactId>
<packaging>war</packaging>
<name>Database Application</name>
<build>
<finalName>theapp</finalName>
<!-- pluginManagement tag required in Eclipse to avoid error:
Plugin execution not covered by lifecycle configuration. -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomee.maven</groupId>
<artifactId>tomee-embedded-maven-plugin</artifactId>
<version>${tomee.version}</version>
<configuration>
<tomeeVersion>${tomee.version}</tomeeVersion>
<tomeeClassifier>
${tomee.classifier}</tomeeClassifier>
<synchronization>
<extensions>
<!-- To update each time app built
with mvn compile -->
<extension>.class</extension>
<extension>.properties</extension>
<extension>.css</extension>
</extensions>
<updateInterval>2</updateInterval>
</synchronization>
<!-- For some reason, must to be false
or reloading does not work! -->
<reloadOnUpdate>false</reloadOnUpdate>
<warFile>
${project.build.directory}/${project.build.finalName}
</warFile>
<!-- path tused by tomEE in the tomee:deploy and
tomee:undeploy goals -->
<path>
${project.build.directory}/apache- tomee/webapps${project.build.finalName}
</path>
<args>
-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server
-Xms128m -Xmx4096m -XX:PermSize=196m -XX:MaxPermSize=128m
-XX:+DisableExplicitGC</args>
<libs>
<lib>
mysql:mysql-connector-java:${mysql-connector-version}
</lib>
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.tomee</groupId>
<artifactId>apache-tomee</artifactId>
<version>${tomee.version}</version>
<classifier>${tomee.classifier}</classifier>
<type>zip</type>
<!-- set this to runtime for it to work -->
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
关于插件管理标签,请参见http://stackoverflow.com/questions/6352208/how-to-solve-plugin-execution-not-covered-by-lifecycle-configuration-for-sprin
这可能无法回答您所有的配置问题,也不可能为您的项目提供理想的框架,但是它可以帮助您入门。
关于java - 单个应用程序的TomEE嵌入式/捆绑式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34160080/