我阅读了所有模块化文档,但仍然无法弄清这里的问题:我通过Maven添加了一个依赖项(我也尝试过手动将jar添加到项目库中,但仍然会导致相同的问题),但是当我导入时从那个类到我的类,IntelliJ说“在模块com.fazecast.jSerialComm中声明了com.fazecast.jSerialComm包,但是模块com.greeting却没有读”。
它给了我两个选择:将其添加为我已经做过的Maven依赖项(它在我的pom.xml中,并且可以在依赖项下看到它)或“将com.fazecast.jSerialComm指令添加到module-info.java中”。如果添加requires com.fazecast.jSerialComm
,它可以正常编译,但是当我创建模块化jar并尝试使用java -p mods/ -m com.greeting/com.mayapp.Runner
运行jar时,它会告诉我“ java.lang.module.FindException:Module com.fazecast。找不到jSerialComm,必须通过com.greeting进行。”
我还尝试了更多的jar /依赖项,这给了我同样的问题。我也使用Gradle尝试了Java 9和10,并通过IntelliJ创建了工件。有同样的例外。我的module-info.java
在我的应用启动时位于src/main/java
中。任何帮助将不胜感激。
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)
Maven home: C:\Apache\apache-maven-3.5.4-bin\apache-maven-3.5.4\bin\..
Java version: 9.0.4, vendor: Oracle Corporation, runtime: C:\Program iles\Java\jdk-9.0.4 Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
Intelli J 2018.1.6
<?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>com.myapp</groupId>
<artifactId>greet</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>10</source>
<target>10</target>
<release>9</release>
<executable>javac10</executable>
<compilerArgs>
<arg>-Xlint:all,-processing</arg>
</compilerArgs>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.0.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
package com.myapp;
import com.fazecast.jSerialComm.SerialPort;
public class Runner {
public static void main(String[] args) {
System.out.println("Runner");
}
}
module com.greeting {
requires com.fazecast.jSerialComm;
}
答案 0 :(得分:0)
如果您开发模块(如module-info.java
所示),all dependencies need to be required(这是IntelliJ建议的快速修复),并且需要on the module path(而不是类路径)进行编译并启动。对于编译,Maven,Gradle和IntelliJ做正确的事情,并且从IntelliJ启动应用程序时,它也会做正确的事情。
问题很可能与您的java
命令有关:
java -p mods/ -m com.greeting/com.mayapp.Runner
它指向mods
作为模块路径,但是除非您忘记提及您执行的某些步骤,否则该文件夹不包含您应用程序的依赖项,因此,当Java查找它们时,它将找不到它们-错误消息。
要将依赖项放入该文件夹,您可以手动复制它们(不要忘记传递依赖项),也可以使用Maven's copy-dependencies
mojo:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/../mods</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
运行mvn package
或mvn install
时,您会在mods
中找到所有依赖项,包括可传递的依赖项,然后您的命令应该可以使用。