将Tomcat与应用程序嵌入一个胖罐中

时间:2012-11-11 18:03:55

标签: java tomcat build jar onejar

我希望将Tomcat 我的网络应用程序组合/嵌入又称胖罐,但我不确定它是否可行。它可以与Jetty using the Maven Shade pluginWinstone一起使用,但是我尝试了与Tomcat 7类似的东西并且无法正确加载它。目标是能够执行以下操作:java -jar mywebapp.jar

问题是Tomcat想要从文件系统而不是从类路径加载东西。也就是说,您可以嵌入Tomcat,但它会期望您的WAR文件可用作文件。

我在之前SO Posts for embedding Tomcat 6 & 7尝试了很多技巧。虽然我可以将其嵌入并启动,但无法访问我的应用程序。

我想一个选项就是让JAR在启动时解压缩,这样AppBaseDocBase就是文件系统上的文件。我还没试过,但是会。

这里有一个重复的问题,我终于找到了:Self-contained war file with Tomcat embedded?(请投票结束重复)

2 个答案:

答案 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创建的项目结构:

Maven Project Structure

运行JAR

然后我使用以下命令运行JAR:

$ java -jar executable.jar

更多信息

这些都是基础知识。我也在how to create an embedded Tomcat JA R上发布了一个视频,以供有兴趣查看从头到尾所有步骤的人。