将现有WAR添加到嵌入式tomcat

时间:2017-05-09 18:23:23

标签: java spring tomcat spring-boot

我已经用Google搜索了这个问题,但我没有找到任何针对此案例的内容。我发现很多"如何将Spring Boot WAR部署到Tomcat"但没有关于使用Spring Boot包装现有的Tomcat WAR。

我试图用Spring Boot" wrapper"来包装现有的WAR。这样就不必重新配置现有的代码库。 This solution不起作用,因为它取决于在绝对位置可用的WAR,而我们正在尝试打包"应用程序" Spring Boot WAR中的WAR。然后我们可以像这样添加WAR的上下文:

Context context = tomcat.addWebapp("myapp", Thread.currentThread().getContextClassLoader().getResource("myapp.war").getPath());

这几乎正常。我对某个特定问题有疑问。将现有WAR文件放入Spring Boot项目时,它将被放入/WEB-INF/lib-provided而不是/WEB-INF/classes。我无法找到一种方法让嵌入式Tomcat从此位置添加WAR文件。 ClassLoader不会加载它,因为它不在WEB-INF/classes下。

是否有一种从/WEB-INF/lib-provided获取此WAR的灵巧方式(或任何方式)?

1 个答案:

答案 0 :(得分:1)

对于其他需要执行此操作的人,答案是使用maven-dependency-plugin并设置spring-boot-maven-plugin以从资源中排除WAR文件(否则您将获得两个WAR副本)你的Spring Boot WAR):

        <!-- include your WAR as a resource instead of a dependency -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <excludeTransitive>true</excludeTransitive>
                        <includeArtifactIds>my-war-name-here</includeArtifactIds>
                        <stripVersion>true</stripVersion>
                        <outputDirectory>${project.basedir}/src/main/resources</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>


        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.5.3.RELEASE</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <!-- Don't copy the war as a dependency, it's included as a resource -->
                        <excludeArtifactIds>my-war-name-here</excludeArtifactIds>
                    </configuration>
                </execution>
            </executions>
        </plugin>