Java 9モジュールを定義しようとしています。次のようなものを定義しました:
module my.module.name {
}
それから私のファイルの多くは私にエラーを出し始めました、彼らはいくつかのパッケージを見つけることができないということです。次に、IntelliJの自動ヘルプ機能を使用して、module-info.Javaにいくつかの「requires」ステートメントを追加しました。だからそれは次のようなものになりました:
module my.module.name {
requires spring.web;
requires sshd.core;
requires com.fasterxml.jackson.core;
....
}
IntelliJはすべてのコードをエラーなしで表示します。しかし、「Mavenプロジェクト」ウィンドウで「コンパイル」をクリックすると(コンパイルにMaven 3.5.3とOracle JDK 10を使用しています)、次のように表示されます。
src/main/Java/module-info.Java:[2,20] module not found: spring.web
src/main/Java/module-info.Java:[11,18] module not found: sshd.core
src/main/Java/module-info.Java:[13,35] module not found: com.fasterxml.jackson.core
...
same for the other modules I "require".
私が理解している限り、モジュールとして定義されていないサードパーティのライブラリは、「自動」モジュールを生成します。だから私は私が必要とする瓶の1つを見つけました:
C:\Users\<my username>\.m2\repository\org\springframework\spring-web\5.0.5.RELEASE\spring-web-5.0.5.RELEASE.jar
次のコマンドを使用して、「自動」モジュールの名前を確認したいと考えました。
jar.exe" --file=spring-web-5.0.5.RELEASE.jar --describe-module
No module descriptor found. Derived automatic module.
[email protected] automatic
...
私の調査によると、私が「必要とする」モジュールの名前は正しいです!何が欠けていますか?なぜ私は得るのですか
module not found: spring.web
他のモジュールも同じですか?私はいくつかのパスまたは何かを逃していますか?
編集:要求どおり、ここに私の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>mygroupid</groupId>
<artifactId>myartifactid</artifactId>
<version>1.0.1-RELEASE</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<Java.version>1.9</Java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.Apache.sshd/Apache-sshd -->
<dependency>
<groupId>org.Apache.sshd</groupId>
<artifactId>Apache-sshd</artifactId>
<version>1.7.0</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.Java.dev.jna/jna -->
<dependency>
<groupId>net.Java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>net.Java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptors>
<descriptor>Assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-Assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.9</source>
<target>1.9</target>
</configuration>
</plugin>
</plugins>
</build>
Edit2:以下をmaven-compiler-plugin構成に追加しようとしました:
<compilerArgs>
<arg>--add-modules</arg><arg>spring.web</arg>
</compilerArgs>
次に、「mvn compile -X」でコンパイルして完全なデバッグログを取得しようとしたため、コンパイルのためにコマンドラインを実行しました。
[INFO] Changes detected - recompiling the module!
[DEBUG] Classpath:
[DEBUG] Source roots:
[DEBUG] D:\Work\gitrepos\mymoduleproject\src\main\Java
[DEBUG] D:\Work\gitrepos\mymoduleproject\target\generated-sources\annotations
[DEBUG] Command line options:
[DEBUG] -d D:\Work\gitrepos\mymoduleproject\target\classes -sourcepath D:\Work\gitrepos\mymoduleproject\src\main\Java;D:\Work\gitrepos\mymoduleproject\target\generated-sources\annotations; -s D:\Work\
gitrepos\mymoduleproject\target\generated-sources\annotations -g -nowarn -target 1.9 -source 1.9 -encoding UTF-8 --add-modules spring.web
しかし、再び...私は得る
module-info.Java:[2,20] module not found: spring.web
他のすべてのモジュールについても同じです...
Edit3:
新しいプロジェクトを作成しましたが、新しいプロジェクトは正常にコンパイルされます(ただし、元のプロジェクトをコンパイルする必要があります!)。私は同じ「mvn compile -X」コマンドを実行しました、そしてここに私が得るものがあります:
[INFO] Changes detected - recompiling the module!
[DEBUG] Classpath:
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\spring-web\5.0.4.RELEASE\spring-web-5.0.4.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\spring-beans\5.0.4.RELEASE\spring-beans-5.0.4.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\spring-core\5.0.4.RELEASE\spring-core-5.0.4.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\spring-jcl\5.0.4.RELEASE\spring-jcl-5.0.4.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\boot\spring-boot-starter\2.0.0.RELEASE\spring-boot-starter-2.0.0.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\spring-aop\5.0.4.RELEASE\spring-aop-5.0.4.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\spring-expression\5.0.4.RELEASE\spring-expression-5.0.4.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.0.0.RELEASE\spring-boot-starter-logging-2.0.0.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar
[DEBUG] C:\Users\myuser\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\Apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\Apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar
[DEBUG] C:\Users\myuser\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar
[DEBUG] Modulepath:
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.0.RELEASE\spring-boot-autoconfigure-2.0.0.RELEASE.jar
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\boot\spring-boot\2.0.0.RELEASE\spring-boot-2.0.0.RELEASE.jar
[DEBUG] D:\Work\gitrepos\demo\javamodules\target\classes
[DEBUG] C:\Users\myuser\.m2\repository\org\springframework\spring-context\5.0.4.RELEASE\spring-context-5.0.4.RELEASE.jar
[DEBUG] Source roots:
[DEBUG] D:\Work\gitrepos\demo\javamodules\src\main\Java
[DEBUG] D:\Work\gitrepos\demo\javamodules\target\generated-sources\annotations
[DEBUG] Command line options:
[DEBUG] -d D:\Work\gitrepos\demo\javamodules\target\classes -classpath C:\Users\myuser\.m2\repository\org\springframework\spring-web\5.0.4.RELEASE\spring-web-5.0.4.RELEASE.jar;C:\Users\myuser\.m2\repository\
org\springframework\spring-beans\5.0.4.RELEASE\spring-beans-5.0.4.RELEASE.jar;C:\Users\myuser\.m2\repository\org\springframework\spring-core\5.0.4.RELEASE\spring-core-5.0.4.RELEASE.jar;C:\Users\myuser\.m2\re
pository\org\springframework\spring-jcl\5.0.4.RELEASE\spring-jcl-5.0.4.RELEASE.jar;C:\Users\myuser\.m2\repository\org\springframework\boot\spring-boot-starter\2.0.0.RELEASE\spring-boot-starter-2.0.0.RELEAS
E.jar;C:\Users\myuser\.m2\repository\org\springframework\spring-aop\5.0.4.RELEASE\spring-aop-5.0.4.RELEASE.jar;C:\Users\myuser\.m2\repository\org\springframework\spring-expression\5.0.4.RELEASE\spring-expres
sion-5.0.4.RELEASE.jar;C:\Users\myuser\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.0.0.RELEASE\spring-boot-starter-logging-2.0.0.RELEASE.jar;C:\Users\myuser\.m2\repository\ch\qos\lo
gback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\myuser\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\myuser\.m2\repository\org\Apache\logging\log4j\log4j-to-
slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;C:\Users\myuser\.m2\repository\org\Apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;C:\Users\myuser\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-
1.7.25.jar;C:\Users\myuser\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\myuser\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar; --module-p
ath C:\Users\myuser\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.0.RELEASE\spring-boot-autoconfigure-2.0.0.RELEASE.jar;C:\Users\myuser\.m2\repository\org\springframework\boot\spring-
boot\2.0.0.RELEASE\spring-boot-2.0.0.RELEASE.jar;D:\Work\gitrepos\demo\javamodules\target\classes;C:\Users\myuser\.m2\repository\org\springframework\spring-context\5.0.4.RELEASE\spring-context-5.0.4.RELEAS
E.jar; -sourcepath D:\Work\gitrepos\demo\javamodules\src\main\Java;D:\Work\gitrepos\demo\javamodules\target\generated-sources\annotations; -s D:\Work\gitrepos\demo\javamodules\target\generated-sources\an
notations -g -parameters -nowarn -target 1.9 -source 1.9 -encoding UTF-8
新しいプロジェクトで「モジュールパス」を取得し、Mavenコマンドラインで他の多くのオプションを取得し、元のプロジェクトでそれらを取得しないのはなぜですか?
問題はpom.xmlにあることがわかりました。コンパイル中に「モジュールが見つかりません」というエラーが発生した理由は、重要ではないと考えていた警告の背後に隠されていたため、ログに貼り付けませんでした。警告は「ZIP ENDヘッダーが見つかりません」でした。この警告が表示されるのは、依存関係に「不正なjar」が含まれていたため、module-info.Javaファイルの解析中にコンパイラが失敗し、上記のエラーが発生したためです。しかし、「不正な」jarはどれでしたか?これだとわかりました(私は一つずつ除外の方法を使っていました...):
<dependency>
<groupId>org.Apache.sshd</groupId>
<artifactId>Apache-sshd</artifactId>
<version>1.7.0</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
</exclusion>
</exclusions>
</dependency>
Apache sshdを検索するときに https://mvnrepository.com からその依存関係を取得しましたが、「type pom」が何を意味するのか正確にはわかりませんが、Apache Minaはいくつかのプロジェクトのセットで、このようにしてすべてのプロジェクトを含めます...とにかく、私はすべてのプロジェクトからApache-sshd-coreだけが必要だったので、依存関係を次のように変更しました(Apache Mina Devコミュニティーからアドバイスを受けました、彼らに感謝します!!!):
<dependency>
<groupId>org.Apache.sshd</groupId>
<artifactId>sshd-core</artifactId>
<version>1.7.0</version>
</dependency>
そして今、すべてがうまくコンパイルされます!コメントと助けてくれてみんなに感謝します!