2017-08-04 28 views
1

埋め込み型のTomcatを使用して、スプリングブートベースのアプリケーションがあります。 mvn spring-boot:runゴールを介してデプロイするときに問題はありません。しかし intelliJスプリングブートプラグインを使用してデプロイしようとすると問題が発生します。重要な点は、デフォルトのpomを変更して、アプリを完全なtomcat Traditional Deploymentにデプロイすることができますが、開発モードでは埋め込みのtomcatを使用してアプリをデプロイするほうがよいでしょう。問題は、IntelliJのIntelliJを使用して埋め込みTomcatを有効にしたスプリングブートアプリケーションをデプロイ

Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.support.SpringBootServletInitializer 
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:380) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:314) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    ... 17 common frames omitted 
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext 
    at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_144] 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_144] 
    at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_144] 
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    ... 22 common frames omitted 
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_144] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_144] 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_144] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_144] 
    ... 26 common frames omitted 

から春のブートアプリケーションを実行しようとしているあなたはなぜこれが起こっているの任意のアイデアを持っていないとき基本的に私たちは、このメッセージを表示して終了したことありますか?どうすれば解決できますか?

EDIT:

私はのIntelliJ IDEAを使用しています2017.2(念のビルドはあるアイデア-IU-172.3317.76)、およびSSCCEとして、getting-started example of spring-bootを使用することができますし、適用することができます伝統の展開(最初のリンク)私たちは、次のファイル

のpom.xml

<?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>org.springframework</groupId> 
    <artifactId>gs-spring-boot</artifactId> 
    <version>0.1.0</version> 
    <packaging>war</packaging> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.6.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> 
    </dependencies> 

    <properties> 
     <java.version>1.8</java.version> 
    </properties> 


    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 
を持つことになりますため提案された変更

はその後、我々はApplication.java

package hello; 

import java.util.Arrays; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.web.support.SpringBootServletInitializer; 
import org.springframework.context.ApplicationContext; 

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 

     System.out.println("Let's inspect the beans provided by Spring Boot:"); 

     String[] beanNames = ctx.getBeanDefinitionNames(); 
     Arrays.sort(beanNames); 
     for (String beanName : beanNames) { 
      System.out.println(beanName); 
     } 
    } 

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

} 

を持っていますそして、私はHelloController.javaを変更」なかったのが、ちょうど完全性について:

package hello; 

import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.bind.annotation.RequestMapping; 

@RestController 
public class HelloController { 

    @RequestMapping("/") 
    public String index() { 
     return "Greetings from Spring Boot!"; 
    } 

} 

この例ではmvn spring-boot:runが、doesnのを使用して問題なく動作しますスプリングブーツインテリジェントのプラグインを使用するときに実行する

+0

は、Enterprise EditionのSDKを使用していますか? – hoodaticus

+0

いいえ、私は実際にはJ2SEを使用していますopenjdk – carpinchosaurio

+0

javax.servletはJ2EEでのみ利用可能です。 https://stackoverflow.com/questions/860022/wheres-javax-servlet – hoodaticus

答えて

1

からjarファイルをダウンロードすることができます - Vの1.5.6.RELEASE(現在のリリース)


ためこの回答参照の春のドキュメントを分析:

IJからメインクラスを実行することは、あなたのアプリを実行することと同じですコマンドラインから。そのため、クラスパスにはcompileruntimeスコープの依存関係のみが含まれます。 Providedは、それがコンパイル時に必要になるだろうということを意味しますが、JDKまたはへのコンテナは、実行時にアプリのにそれを提供期待:

provided これは非常にcompileのようなものですが、あなたが期待するを示しています実行時に依存関係を提供するためのJDKまたはコンテナたとえば、Java Enterprise Edition用のWebアプリケーションを構築する場合、サーブレットAPIおよび関連するJava EE APIへの依存性をスコープprovidedに設定します。これは、Webコンテナによってこれらのクラスが提供されるためです。このスコープは、コンパイルおよびテストのクラスパスでのみ使用でき、推移的ではありません。一方

spring-boot-maven-pluginrun目標実行するための別のクラスパス使用しています。デフォルトでは

を、両方repackagerun目標はで定義されている任意のprovided依存関係が含まれますプロジェクト。ブートベースのプロジェクトでは、アプリケーションを実行するために必要なコンテナの依存関係として、providedの依存関係を考慮する必要があります。


結論とソリューション:

は、だから、クラスパスの設定の問題です。前述のとおり、war packagingまたはtraditional deploymentの場合は、埋め込みサーブレットコンテナを除外する必要があります。ただし、開発中にアプリを実行できるようにするには、埋め込みコンテナが必要です。

1)spring-boot-starter-tomcat依存関係の宣言から<scope>provided</scope>を削除します。

策として

または回避は、あなたには、少なくとも以下の2つのオプションがあります。あなたは、あなたがTomcat is the default container used by spring-boot-starter-webとして、完全にその依存関係を削除することもできますしたかったが、場合

2)働く巧妙なトリックを解除する際、おそらくそれは、それを残して、コメントを追加するのが最善ですので、あなたはそれを忘れないだろうIJを使用していて、プロダクションリリース前にprovidedのコメントを外すことを忘れないようにするには、今のように依存関係を残しておき、IJからアクティブにできるmaven devプロファイルを追加することです。この方法では、デフォルトではprovidedになります。これは、プロファイルを開発して手動で有効にする場合にのみ、戦争に安全にパッケージ化することができます。あなたは、プロファイルを選択することができるようにプロファイルを追加した後、あなたのMavenプロジェクトを再インポート:

<profiles> 
    <profile> 
     <id>dev</id> 
     <dependencies> 
      <dependency> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 

reimport project and activate profile

0

mavenプロジェクトを使用している場合は、広告が必要ですd javax.servlet-apiに依存します。

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>2.5</version> 
    <scope>provided</scope> 
</dependency> 

あなたもhttp://central.maven.org/maven2/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar

+0

@Mayank Sharmaありがとうございますが、これと同じ問題があり、pom.xml – carpinchosaurio

+0

の '.m2'フィラーを削除してプロジェクトを再アップデートして実行してください – Sharma

関連する問題