java - 在一个 Fat Jar 中嵌入带有应用程序的 Tomcat

标签 java tomcat build jar onejar

我希望将 Tomcat 我的 Web 应用合并/嵌入为 aka fat jar 但我不确定它是否可能。 Jetty using the Maven Shade plugin 是可能的和 Winstone但我尝试了与 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? (请投票关闭重复)

最佳答案

我不知道我是怎么一直错过这个的,但是 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 plugin 乱七八糟,还没发布(请大家去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>

关于java - 在一个 Fat Jar 中嵌入带有应用程序的 Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333867/

相关文章:

java - 如何路径@RequestParam中的任何值?

java - Spark rest api 服务器部署

java - Spring MVC 国际化不起作用

msbuild - ResolveProjectReferences 如何工作?

java - 获取 ArrayList 中的元素后将其删除

java - 通过 java 中的套接字损坏的字符串

java - 如何将文件路径传递给远程 Web 服务

build - 从Bamboo REST API获取应用程序的构建统计信息

svn - 如何跨多个位置协作源代码

java - 支持 Java 8 中的 lambda 表达式