我希望将Tomcat 和我的网络应用程序组合/嵌入onejar又称胖罐,但我不确定它是否可行。它可以与Jetty using the Maven Shade plugin和Winstone一起使用,但是我尝试了与Tomcat 7类似的东西并且无法正确加载它。目标是能够执行以下操作:java -jar mywebapp.jar
。
问题是Tomcat想要从文件系统而不是从类路径加载东西。也就是说,您可以嵌入Tomcat,但它会期望您的WAR文件可用作文件。
我在之前SO Posts for embedding Tomcat 6 & 7尝试了很多技巧。虽然我可以将其嵌入并启动,但无法访问我的应用程序。
我想一个选项就是让JAR在启动时解压缩,这样AppBase
和DocBase
就是文件系统上的文件。我还没试过,但是会。
这里有一个重复的问题,我终于找到了:Self-contained war file with Tomcat embedded?(请投票结束重复)
答案 0 :(得分:4)
我不知道我是如何错过这个,但Tomcat Maven插件现在支持生成可执行文件WAR:
http://tomcat.apache.org/maven-plugin-2.0/executable-war-jar.html
更新如果您需要Tomcat 8,则需要特殊配置。您必须使用插件的2.0版本,因为2.2 Tomcat 7插件无效,您将需要第三方插件tomcat8-war-runner。下面我已经附加了您需要的maven配置,这也允许您选择所需的正确版本的Tomcat 8(tomcat.version
属性)。
Tomcat8 maven插件处于凌乱状态,仍然没有被释放(请对jira投票并向他们投诉完成它)。
最后,使用这种maven插件方法的一个主要警告是插件伪嵌入。那就是你的应用程序不会在与Tomcat相同的类加载器中运行,并且在初始化期间实际部署。这种方法有利有弊。
另一方面,Spring Boot和这个example from Oracle将在与您的应用程序相同的类加载器中运行Tomcat(我认为它是真正的嵌入式)。
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<port>${tomcat.port}</port>
<path>/</path>
</configuration>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<path>/</path>
<port>${tomcat.port}</port>
<attachArtifactClassifierType>war</attachArtifactClassifierType>
<mainClass>org.apache.tomcat.maven.runner.Tomcat8RunnerCli</mainClass>
<extraDependencies>
<extraDependency>
<groupId>com.nitorcreations</groupId>
<artifactId>tomcat8-war-runner</artifactId>
<version>1.0</version>
</extraDependency>
</extraDependencies>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-util</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper-el</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-el-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-tribes</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina-ha</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-log4j</artifactId>
<version>${tomcat.version}</version>
</dependency>
</dependencies>
</plugin>
答案 1 :(得分:0)
我做了tutorial on embedded Tomcat JAR步,并希望创建尽可能小的POM文件,以创建可执行的JAR。我不需要任何环境变量或多余的依赖关系-只是裸露的骨头。这是我想出的:
Tomcat插件的POM配置
<?xml version="1.0" encoding="UTF-8"?>
<project>
<!-- create an executable jar file example -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.mcnz.maven</groupId>
<artifactId>javawebapp</artifactId>
<version>1.0-embedded</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Maven embedded Tomcat server example -->
<build>
<finalName>javawebapp</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- context root for Java web apps -->
<path>/tutorial</path>
<!-- name of executable jar file -->
<finalName>executable.jar</finalName>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<!-- end of embedded Tomcat server tutorial -->
</project>
使用Maven运行tomcat7插件
maven命令共同创建嵌入式jar如下:
$ mvn clean install tomcat7:exec-war-only
这是运行命令时maven创建的项目结构:
运行JAR
然后我使用以下命令运行JAR:
$ java -jar executable.jar
更多信息
这些都是基础知识。我也在how to create an embedded Tomcat JA R上发布了一个视频,以供有兴趣查看从头到尾所有步骤的人。