【问题标题】:Embed Tomcat with App in One Fat Jar在一个 Fat Jar 中嵌入带有 App 的 Tomcat
【发布时间】:2012-10-31 07:05:30
【问题描述】:

我希望将 Tomcat 我的网络应用程序组合/嵌入为 aka fat jar,但我不确定它是否可能。 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?(请投票关闭为重复)

【问题讨论】:

标签: onejar java tomcat build jar onejar


【解决方案1】:

我不知道我是怎么一直错过这个的,但是 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>

【讨论】:

    【解决方案2】:

    我做了一个tutorial on embedded Tomcat JARs 并希望创建一个尽可能小的 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 JAR 上发布了一段视频,供任何有兴趣了解从头到尾的所有步骤的人使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-18
      • 2018-03-06
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多