2016-06-20 62 views
1

我有一个包含嵌入式Tomcat的Spring应用程序。作为可执行的战争,它工作正常。因为我将使用AngularJ作为前端,因此将Spring项目放在可执行jar文件中并不实际,因为我将在浏览器中进行调试,并希望能够快速编辑js源文件。如果他们被保存在档案中,这是烦人的。在tomcat上部署的Spring引导将无法启动

这就是为什么我想让它可部署,所以它会解包到tomcat上。这似乎很容易,但我无法实现它的工作。

上下文始终显式加载两次。因为这首先我得到了一个存储库异常(@Repository)我使用(已经被阻止)以及另一个来自spring的异常“由于已经存在根应用程序上下文,所以无法初始化上下文”。

我很困惑,因为我已经阅读过,这很正常,Spring创建了2个上下文,特别是使用MVC。但为什么例外呢?

我SpringApp类看起来像这样

@EnableWebMvc 
@ComponentScan 
@EnableAutoConfiguration 
public class LAuthServerApplication extends WebMvcConfigurerAdapter { 

    @Autowired 
    Environment env; 

    public static void main(String[] args) { 
    System.out.println("#################### Startup parameters ##############"); 
    for (String s : args) { 
     System.out.println("Parameter: " + s); 
    } 
    System.out.println("######################################################"); 
    SpringApplication.run(LAuthServerApplication.class, args); 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
    } 

    @Bean 
    public InternalResourceViewResolver viewResolver() { 
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
    viewResolver.setPrefix("/WEB-INF/pages/"); 
    viewResolver.setSuffix(".jsp"); 
    return viewResolver; 
    } 

为了使部署我加入这个类来我的项目:

@Configuration 
public class AppServletInitializer extends SpringBootServletInitializer { 
    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 
} 

POM:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>ch.comlab.comweb</groupId> 
    <artifactId>LAuth</artifactId> 
    <version>1.0.0</version> 
    <packaging>war</packaging> 
    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 

    </properties> 
    <parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.5.RELEASE</version> 
    </parent> 

    <dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-jasper</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>ch.comlab.comweb</groupId> 
     <artifactId>Infrastructure</artifactId> 
     <version>1.2.6</version> 
    </dependency> 

    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <webResources> 
      <resource> 
       <directory>src/main/webapp</directory> 
       <filtering>true</filtering> 
      </resource> 
      </webResources> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-maven-plugin</artifactId> 
     <configuration> 
      <resources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>src/main/resources/</directory> 
      </resource> 
      </resources> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    <repositories> 
    <repository> 
     <id>spring-releases</id> 
     <url>https://repo.spring.io/libs-release</url> 
    </repository> 
    </repositories> 
    <pluginRepositories> 
    <pluginRepository> 
     <id>spring-releases</id> 
     <url>https://repo.spring.io/libs-release</url> 
    </pluginRepository> 
    </pluginRepositories> 
    <name>LAuth</name> 
</project> 
+1

你见过[春季启动Devtools(HTTP:// docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html)?允许您在IDE中调试应用程序时(不包装在jar中时)即时调试和编辑js文件等文件。无需将其部署到Tomcat进行调试。 – Jesper

+0

@她可以显示你的pom文件吗?我已经做了一个战争配置项目部署到tomcat。我可以与你分享 – cralfaro

+0

[Spring Boot War部署到Tomcat]可能的重复(http://stackoverflow.com/questions/27904594/spring-boot-war-deployed-to-tomcat) – Mudassar

回答

-1

我终于得到它的运行,有以下POM和M.Denium建议代码变化和丹那巴南:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>ch.comlab.comweb</groupId> 
<artifactId>LAuth</artifactId> 
<version>1.0.0</version> 
<packaging>war</packaging> 
<properties> 
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
<maven.compiler.source>1.8</maven.compiler.source> 
<maven.compiler.target>1.8</maven.compiler.target> 

</properties> 
<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent</artifactId> 
<version>1.3.5.RELEASE</version> 
</parent> 

<dependencies> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
    <exclusions> 
    <exclusion> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-tomcat</artifactId> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-el</artifactId> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-web</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-config</artifactId> 
</dependency> 
<dependency> 
    <groupId>ch.comlab.comweb</groupId> 
    <artifactId>Infrastructure</artifactId> 
    <version>1.2.6</version> 
</dependency> 

</dependencies> 
<build> 
<plugins> 
    <plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
     <resources> 
     <resource> 
      <filtering>true</filtering> 
      <directory>src/main/resources/</directory> 
     </resource> 
     </resources> 
    </configuration> 
    </plugin> 
</plugins> 
</build> 
<repositories> 
<repository> 
    <id>spring-releases</id> 
    <url>https://repo.spring.io/libs-release</url> 
</repository> 
</repositories> 
<pluginRepositories> 
<pluginRepository> 
    <id>spring-releases</id> 
    <url>https://repo.spring.io/libs-release</url> 
</pluginRepository> 
</pluginRepositories> 
<name>LAuth</name> 

2

相信其因来自spring-boot-tomcat的嵌入式服务器。

你可以排除嵌入式tomcat并尝试? 如:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
    <exclusions> 
     <exclusion> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

也除去你给旁边的弹簧引导启动的Web Tomcat的依赖。

2

如果你使用Spring Boot,你的配置有点混乱和冗长。

您应该从插件列表中删除maven-war-plugin。由于spring-boot-maven-plugin已经(和父母也是)照顾这些事情。

接下来您的配置删除了一些代码,并将LAuthServerApplication和您的启动器合并为一个。并使用@SpringBootApplication而不是单个注释(保存您的代码)。

@SpringBootApplication 
public class LAuthServerApplication extends SpringBootServletInitializer { 

    @Autowired 
    Environment env; 

    public static void main(String[] args) { 
     System.out.println("#################### Startup parameters ##############"); 
     for (String s : args) { 
      System.out.println("Parameter: " + s); 
     } 
     System.out.println("######################################################"); 
     SpringApplication.run(LAuthServerApplication.class, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(LAuthServerApplication.class); 
    } 

} 

在你application.properties添加

spring.mvc.view.prefix=/WEB-INF/pages/ 
spring.mvc.view.suffix=.jsp 

春季启动已配置的Spring MVC为您和您与干扰。除非您有非常特殊的需求,否则不要覆盖默认值。

现在重建并重新启动您的应用程序。

说明:恕我直言,将解压后的文件直接编辑到tomcat中是一个非常糟糕的主意,因为您真的想编辑源文件。你可能想要看看JHipster这个项目,它统一了JS和Spring Boot的开发。

+0

谢谢,我尝试了您的建议更改。我仍然在“无法初始化上下文,因为已经存在根应用程序上下文”。 为什么在tomcat中直接编辑js文件是个坏主意?我看到它可以节省很多时间。 –

+0

因为您正在编辑部署的文件,您需要将其复制回工作区以准备最终的工件。这将在未来的某个时候咬你。你的类路径中是否有'web.xml'或其他'WebApplicationInitializer'? –

相关问题