我目前正在探索构建绑定到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/

10-12 04:57