Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在外部Tomcat服务器中运行WAR文件的安装代码_Java_Spring_Spring Boot_Tomcat_Tomcat9 - Fatal编程技术网

Java 如何在外部Tomcat服务器中运行WAR文件的安装代码

Java 如何在外部Tomcat服务器中运行WAR文件的安装代码,java,spring,spring-boot,tomcat,tomcat9,Java,Spring,Spring Boot,Tomcat,Tomcat9,我正在构建一个spring boot应用程序,开始时,我需要检查一些系统文件,并使用应用程序在其中找到的信息准备一些数据库池。通常情况下,我会在@SpringBootApplication注释类的主方法中包含该类,但是,当我将我的应用程序作为WAR文件部署到外部Tomcat服务器时,该主类似乎不会运行。我已经检查了主类中应该包含的内容,现在我的主应用程序类如下所示: package com.companyname.projectname; import com.companyname.proj

我正在构建一个spring boot应用程序,开始时,我需要检查一些系统文件,并使用应用程序在其中找到的信息准备一些数据库池。通常情况下,我会在
@SpringBootApplication
注释类的主方法中包含该类,但是,当我将我的应用程序作为WAR文件部署到外部Tomcat服务器时,该主类似乎不会运行。我已经检查了主类中应该包含的内容,现在我的主应用程序类如下所示:

package com.companyname.projectname;

import com.companyname.projectname.database.DatabasePoolManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class WebApplication extends SpringBootServletInitializer {

    private static final Logger logger = LoggerFactory.getLogger(WebApplication.class);

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(WebApplication.class, args);
        DatabasePoolManager dpm = applicationContext.getBean(DatabasePoolManager.class);
        dpm.setUpPools();
        logger.error("\n\nIS ANYBODY OUT THERE?\n\n");
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        logger.error("\n\nIS ANYBODY OUT THERE? (But in the configure method)\n\n");
        return builder.sources(WebApplication.class);
    }

}
这与我原来的设置不同,因为
扩展了
并覆盖了
配置


到目前为止,我的Intellij IDE仍然可以正常运行,但是一旦移动并部署到tomcat服务器,就不会出现任何日志消息。该应用程序仍然可以工作,但显然缺少一些授予其功能的设置(与数据库的连接)。当我将此应用程序部署为WAR文件时,如何在应用程序启动时运行一些设置代码?

再次感谢上面评论中的M.Deinum,要在启动时运行一次,我使用了如下所示的新类:

package com.companyname.projectname;

import com.companyname.projectname.database.DatabasePoolManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class AppStartupRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext applicationContext;

    private static final Logger logger = LoggerFactory.getLogger(AppStartupRunner.class);

    @Override
    public void run(ApplicationArguments args) throws Exception {
        DatabasePoolManager dpm = applicationContext.getBean(DatabasePoolManager.class);
        dpm.setUpPools();
    }
}

将该设置代码放入将在应用程序启动时执行的
ApplicationRunner
CommandLineRunner
中。这样,它在任何一种情况下都会起作用。我还想知道你需要设置什么样的池,以及你是否真的应该以不同的方式进行设置。这正是我所需要的,谢谢。我正在设置的只是Hikari数据库池,在设置过程中,我让我的程序查找本地TNS文件和密码服务,然后在此基础上创建池。你有没有其他的想法来做这件事?这似乎有点老套?如何在应用程序上下文中注册它们?最简单的方法是使
setUpPools
方法成为init方法,或者在启动后从应用程序侦听器调用它。这样,它在任何情况下都会起作用。啊,好的。因此,类似于本文件第2.3节的内容:类似于是的。另外,如果你知道有多少个游泳池,为什么不干脆把它们做成豆子呢?或者甚至可以为它创建一个
BeanDefinitionRegistryPostProcessor
,这样您就可以添加bean定义,这些定义将由Spring处理和管理。您在Spring之外创建池的事实再次让人感觉不舒服。