2015-05-09 56 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的一个例子。