【问题标题】:Spring boot project war running in External TOMCAT fails在外部 TOMCAT 中运行的 Spring Boot 项目战争失败
【发布时间】:2021-01-23 06:42:00
【问题描述】:

我是 Spring Boot 的新手,我创建了一个新项目并产生了相同的战争。 当我使用主类在 Eclipse 上运行时,它运行良好。

public class Java3Application {

    private static final Logger logger = LogManager.getLogger(Java3Application.class);
    public static void main(String[] args) {
        SpringApplication.run(Java3Application.class, args);

    }
}

但是当我在外部 TOMCAT 中部署和 war 一样的时候,应用程序会抛出这样的异常,

08-Oct-2020 11:43:51.476 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/UMS_JAVA3-0.0.1-SNAPSHOT]]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:970)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1840)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.sixdee.UmsJava3Application]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/Framework.properties]
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:319)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)

framework.properties 是我的属性文件,它在我通过主类运行应用程序时第一次加载。

@RestController
public class ConfigServlet {

    @Autowired
    private Cache cache;
    
    @Autowired
    private StartupBean startupbean;
    
    @PostConstruct
    public void init() {
}

在这里,我正在自动连接“Cache”类,它正在加载“Framework.properties”

@Component
@Configuration
@PropertySource("Framework.properties")
public class Cache {
}

注意:我没有使用 web.xml 文件,我使用@Postconstruct 来启动应用程序。

【问题讨论】:

  • 请检查您的war文件是否在正确的文件夹中包含您的Framework.properties。
  • 这是我的属性文件在 Tomcat F:\apache-tomcat-8.5.57\webapps\Appname_JAVA3-0.0.1-SNAPSHOT\WEB-INF\classes\ 的 webapps 文件夹中的位置Framework.properties 。在我的eclipse spring 项目中,它位于\src\main\resources\Framework.properties 资源文件夹中
  • 打包战争有错误吗??
  • 带有classpath: 的前缀也会删除@Component。最后只需将这些属性放在Spring Boot自动加载的application.properties中即可,省去很多麻烦。
  • 不,它不会停止,WEB-INF/classes 是类路径。如前所述,只需前缀classpath:。

标签: java spring spring-boot tomcat8


【解决方案1】:

我解决了这个,

i)需要在我们通过@propertysource读取的每个属性文件名之前添加前缀classpath:,否则会抛出缺少属性文件异常。

ii) 删除 @component ,我不必要地添加了一些注释。

执行这些步骤后,属性文件能够加载到外部 TOMCAT 中,并且部署了战争。

【讨论】:

    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 2015-10-28
    • 2021-01-26
    • 2018-07-05
    • 2015-06-19
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多