我有Spring Boot应用程序版本1.5.x,它正在使用org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory,我正在尝试将其迁移到Spring Boot 2,但该应用程序无法编译,尽管它具有依赖性org.springframework.boot:spring-boot-starter-tomcat.编译器发出以下错误:
error: package org.springframework.boot.context.embedded.tomcat
Run Code Online (Sandbox Code Playgroud) 我有一个server依赖于web模块的模块:
<dependency>
<groupId>org.ema.server</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>war</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是spring-boot-maven-plugin为了获得一个独立的重新打包:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>org.ema.server.Server</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
到目前为止一切正常.该web模块将被包含在最终的jar中BOOT-INF/lib/web-0.0.1-SNAPSHOT.war.
我知道Spring允许在运行时为Tomcat加载额外的war文件,但是看起来这样的war文件必须位于文件系统的某个地方,否则我做错了.
问题是我如何保持独立的感觉,但仍然能够将war文件添加到我的最终独立jar并将它们部署到内置的Tomcat?
下面的代码显示了如何做到这一点,但我不确定它是否可以按我要求的方式完成:
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
LOGGER.info("Adding web app");
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
// Ignore that since it's not working anyway.
String resourcePath = getClass().getResource("/../lib/web-0.0.1-SNAPSHOT.war").getPath().toString();
try {
tomcat.addWebapp("/web", resourcePath);
} …Run Code Online (Sandbox Code Playgroud) 我创建了一个简单的测试用例,显示了我目前面临的问题。
我试图做的是手动启动从 CommandLineRunner 嵌入的 Tomcat 并手动部署文件系统上某处可用的 war 文件:
package example;
import java.io.File;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
File tomcatBaseDir = new File("<tomcat-base-dir>");
File warToBeDeployed = new File("<war-to-be-deployed>");
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
tomcat.setBaseDir(tomcatBaseDir.getAbsolutePath());
tomcat.getHost().setAppBase(tomcatBaseDir.getAbsolutePath());
tomcat.getHost().setAutoDeploy(true);
tomcat.getHost().setDeployOnStartup(true);
try {
tomcat.start();
System.out.println("Tomcat started on " + tomcat.getHost());
} catch (LifecycleException e) {
System.err.println("Tomcat could not be started");
System.exit(-1);
}
Context appContext …Run Code Online (Sandbox Code Playgroud)