2017-07-04 69 views
5

Bu uygulamadaki sorun nedir? Sınıf yolu kavanozları ve modül kavanozlarının karışımı geçerli olduğunu düşündüm. Açık bir modül bilgisi olmayan tüm kavanozlar için otomatik bir modül haline mi gelir? Module-info.java'mı sildiğimde çalışır. Çünkü IDEA bu ​​dava için sınıf yolunu kullanıyor.Jdk9 ile bahar önyüklemesini jigsaw modülleri kullanarak çalıştırın

Java (TM) SE Runtime Environment (build 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

Modülünüzü paketinize göre adlandırmanız önerilir. Örneğin, '' modül com.foo.test {...} ' – axiopisty

cevap

5

Spring.boot'un otomatik bir modül olduğunu varsayalım. Bir otomatik modül bağımlılığı bildirmez, bu nedenle ihtiyaç duyulan açık modüllerin çözülmesini sağlamak için --add-modules'u kullanmanız gerekir. Spring.boot açık bir modül olsaydı, requires java.sql olacağını varsayardım ve bu sorunu yaşamayacaksınız.

+0

vm argümanı: --add-modules = java.sql de çalışır ama bu demek değil misiniz? – Daniel

+4

Evet, java.sql modülünün çözüldüğünden emin olmak için 'add-modules = java.sql' demek istedim. Aksi takdirde çözümlenmez, çünkü modül gerektirmez. Modülünüze 'java.sql 'ifadesini ekleyerek çalıştınız, ancak buna gerek duyulmayacak (ve spring.boot'un açık bir modüle geçirildikten sonra gerekmeyecek). –

+0

Alex Buckley, devoxxUS'ta (JDK 9 ile Modüler Geliştirme) otomatik modülleri anlattı: "... Her şeyi gerektirir, birbirlerini gerektirirler, jdk görüntüsündeki tüm modülleri gerektirirler ve tüm modüllerinizi de gerektirirler ve dışa aktarırlar onların paketleri ... "(Alıntı söylediği gibi). Hala neden alamıyorum java.sql modülünü eklemek zorundayım. Ve her neyse neden gerektiğinde sadece java.sql? Spring.boot'un biraz daha fazla olduğundan eminim. Aynı bağımlılık gerektirmez ve "bağımlılık ilan eder" mi? – Daniel

0

Bu, şüphesiz MySql için jdbc sürücü kavanoğunu kaçırdığınız için. Eğer bu bağımlılığı kullanmak gerekir: -

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

Farklı değil, aynı stacktrace'i alıyorum. – Daniel

3

nihayet, ben ... benim modül-info böyle bakmak zorunda var:

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 
} 

Birisi anlamak ve açıklamak java gerektirir Can. sQL; kullanmadığım zaman kendi modülümün içinde mi?