2017-07-04 1 views
5

このアプリケーションに問題があります。クラスパスjarとモジュールjarの組み合わせが有効だと思いました。明示的なmodule-infoを持たないすべてのjarが自動モジュールになるのはなぜですか? module-info.javaを削除すると動作します。 IDEAはこの場合のクラスパスを使用しているためです。ジグソーモジュールを使用してjdk9でスプリングブートを実行

のJava(TM)SEランタイム環境(ビルド9 + 176)

のIntelliJ IDEA 2017年1月4日

module-info.java

module test { 
    requires spring.boot.autoconfigure; 
    requires spring.boot; 
} 

App.java

package com.foo.test; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class App { 

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

pom.xml

<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>com.foo.test</groupId> 
    <artifactId>test</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>2.0.0.M2</version> 
    </parent> 

    <name>test</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.9</maven.compiler.source> 
     <maven.compiler.target>1.9</maven.compiler.target> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <repositories> 
     <repository> 
      <id>spring-milestones</id> 
      <name>Spring Milestones</name> 
      <url>https://repo.spring.io/libs-milestone</url> 
      <snapshots> 
       <enabled>false</enabled> 
      </snapshots> 
     </repository> 
    </repositories> 
</project> 

Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationContextInitializer : org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer at [email protected]/org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:439) at [email protected]/org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:418) at [email protected]/org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:409) at [email protected]/org.springframework.boot.SpringApplication.(SpringApplication.java:266) at [email protected]/org.springframework.boot.SpringApplication.(SpringApplication.java:247) at [email protected]/org.springframework.boot.SpringApplication.run(SpringApplication.java:1245) at [email protected]/org.springframework.boot.SpringApplication.run(SpringApplication.java:1233) at test/com.foo.test.App.main(App.java:10) Caused by: java.lang.NoClassDefFoundError: java/sql/SQLException at [email protected]/org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:145) at [email protected]/org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:435) ... 7 more Caused by: java.lang.ClassNotFoundException: java.sql.SQLException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496) ... 9 more

+0

パッケージに応じてモジュールの名前を付けることを強くお勧めします。例: 'module com.foo.test {...} ' – axiopisty

答えて

5

私はspring.bootが自動モジュールだと思います。自動モジュールでは依存関係が宣言されていないため、必要な明示的モジュールが確実に解決されるように--add-modulesを使用する必要があります。 spring.bootが明示的なモジュールだった場合、私はそれがrequires java.sqlと仮定し、この問題は発生しません。

+0

引数:--add-modules = java.sqlも動作しますが、それは意味しませんか? – Daniel

+4

はい、私は '--add-modules = java.sql'を意味して、java.sqlモジュールが解決されたことを確認しました。それはモジュールがそれを必要としないので解決されません。あなたはあなたのモジュールに 'requires java.sql'を追加することでそれを回避しましたが、これは必要ではありません(spring.bootが明示的なモジュールに移行されても必要ないでしょう)。 –

+0

Alex Buckleyは、devoxxUS(JDK 9のモジュラー開発)の自動モジュールに次のように語っています。「...すべてが必要です。お互いが必要です.jdkイメージのすべてのモジュールが必要です。また、すべてのモジュールも必要です。彼らのパッケージ... "(引用は彼が言ったものと似ています)。私はまだそれをなぜjava.sqlモジュールを追加する必要はありません。とにかくそれはなぜjava.sqlだけが必要なのですか?私はかなりspring.bootがもう少し持っていることを確信しています。必須であり、依存関係を宣言することは同じではないか? – Daniel

0

これは、MySql用のjdbcドライバjarがないためです。あなたはこの依存関係を使用する必要があります -

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>6.0.5</version> 
</dependency> 
+0

異なるのは、私は同じスタックトレースを取得します。 – Daniel

3

最後に、私はそれを得た...私のモジュールの情報は次のように見ています

module test { 
    requires java.sql; // my real problem solved with this 
    requires spring.boot.autoconfigure; 
    requires spring.boot; 
    exports com.foo.test; // subsequent error 1: beeing accessible for some spring modules 
    opens com.foo.test to spring.core; // subsequent error 2: beeing accessible for spring.core in a deep reflection way 
} 

私は、Javaを必要としなければならない理由を誰かが説明することができます。 SQL;私のモジュールの中で私はそれを使用しない?

関連する問題