2015-05-09 58 views
6

我想創建一個從春季啓動應用程序,我可以部署到一個獨立的Tomcat容器戰爭文件,而不是使用嵌入式之一。春季啓動war文件可與嵌入,但不是獨立的Tomcat

我可以創建war文件並使用"java -jar pdfjs-annotator.war"自己運行它,它工作正常。

我建立gradle bootRepackage的應用程序(使用搖籃,Tomcat7,爪哇1.7)。

但是,當我將war文件部署到獨立的Tomcat並啓動它時,該應用程序似乎根據日誌無誤啓動,但我無法訪問任何資源,也無法控制器網址工作。

例如,我的index.html是src/main/resources/static/index.html下的一個靜態html頁面,我通常可以通過localhost:8080/index.html調用該頁面,但是當部署到獨立的Tomcat ,頁面不獲取傳遞(它,然後在WEB-INF /班/靜態/ index.html的戰爭文件)通過同一網址。而且任何類型的控制器映射似乎都不起作用。我得到一個404錯誤,而不是。

的build.gradle:

buildscript { 
    ext { 
     springBootVersion = '1.2.3.RELEASE' 
    } 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
     classpath("io.spring.gradle:dependency-management-plugin:0.5.0.RELEASE") 
    } 
} 

apply plugin: 'java' 
apply plugin: 'eclipse-wtp' 
apply plugin: 'idea' 
apply plugin: 'spring-boot' 
apply plugin: 'io.spring.dependency-management' 
apply plugin: 'war' 


war { 
    baseName = 'pdfjs-annotator' 
    version = '1.0.0-SNAPSHOT' 
} 

allprojects { 
    apply plugin: 'java' 
    sourceCompatibility = 1.6 
    targetCompatibility = 1.6 
} 

repositories { 
    mavenCentral() 
} 

configurations { 
    providedRuntime 
} 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-data-jpa") 
    compile("org.springframework.boot:spring-boot-starter-data-rest") 
    compile("org.springframework.boot:spring-boot-starter-web") 
    runtime("mysql:mysql-connector-java") 
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") 
    testCompile("org.springframework.boot:spring-boot-starter-test") 
    compile ('org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final') 
} 


eclipse { 
    classpath { 
     containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER') 
     containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7' 
    } 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.3' 
} 

我的主要應用類:

@EnableJpaRepositories 
@SpringBootApplication 
public class PdfAnnotator extends SpringBootServletInitializer { 

    public static void main(String[] args) { 
     SpringApplication.run(PdfAnnotator.class, args); 
    } 

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

} 

當我看着分解的戰爭,我確實看到以下META-INF /清單.MF

Manifest-Version: 1.0 
Start-Class: com.mypackage.pdfcomment.PdfAnnotator 
Spring-Boot-Version: 1.2.3.RELEASE 
Main-Class: org.springframework.boot.loader.WarLauncher 

通常產生兩級戰的文物,一個命名的.war,一個名爲.war.original的gradle這個生成過程 - 將.war是持有正確的MANIFEST.MF條目中的一個,它是我用來部署到獨立的Tomcat的一個。

什麼是缺失?我已經檢查其他問題在這裏SO:

,也是春季啓動文檔,但找不到的什麼是錯的提示。

* ===更新=== *

我安裝了一個全新的Tomcat7,部署war文件那裏,一切都工作正常。似乎與我運行的Tomcat實例/配置有關。不知道究竟是什麼問題,但我不打算進一步檢查它,因爲現在使用新的Tomcat工作正常。

+0

Spring Boot gradle插件通常會創建兩個工件,一個用於Tomcat,另一個不用。我忘了命名,但只是嘗試兩個。除此之外,我會使用戰爭文件。我知道這不再是必要的,但要安全。 –

+0

@ mh-dev對,我想你的意思是.war和.war.original - 我會試試看。到目前爲止,我剛剛使用了.war。 –

+0

@ mh-dev我嘗試了兩種,但沒有區別。無論如何,我使用的.war應該是正確的,因爲這是唯一擁有正確MANIFEST.MF條目的。 –

回答

0

該項目實際上是設置正確,它原來,問題出在我運行Tomcat實例。可能是配置或罐子有問題。這個實例已經存在了很長時間,也許隨着時間的推移,事情會變得混亂起來。

現在安裝了一個全新的Tomcat7實例,戰爭工作得很好。

+0

我認爲這可能是你的問題http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file – Giordano

+0

我已經完成了所有這些工作,但並沒有工作,無論如何,它與Tomcat實例本身有關,而不是應用程序 –

+0

好吧,沒關係然後^^ – Giordano

0

你能否提供一些關於如何打包WAR的更多細節?春季啓動需要一個main方法將被明確指定:

<packaging>war</packaging> 
... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <goals> 
         <goal>repackage</goal> 
        </goals> 
        <configuration> 
         <mainClass>your.app.class.with.Main</mainClass> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

請注意,我使用gradle而不是maven。以上build.gradle是我所使用的。當我查看META-INF/MANIFEST.MF時,我確實看到了定義的主要方法: Manifest-Version:1.0 Start-Class:com.mypackage.pdfcomment.PdfAnnotator Spring-Boot-Version:1.2.3 .RELEASE 主要類:org.springframework.boot.loader.WarLauncher。由於我使用的註釋,Spring Boot應該使用public static void main(String [] args)方法自動查找類。 –

+0

好吧,我的壞,我沒有真正閱讀你的消息:( –

+0

你是否將WAR複製到Tomcat的原始名稱? –

1

我有這個確切的問題。這是因爲我的應用程序是使用Java 1.8構建的,但Tomcat使用1.7。一切似乎都正確部署,沒有錯誤。我只是得到了一個404嘗試打我的服務,這對嵌入式tomcat服務器來說沒有問題。花了我很長時間才弄明白,但這只是在Tomcat安裝上升級java的一個例子。