2016-06-20 152 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'? –

相關問題