Модульный Java-модуль не найден

Я прочитал всю модульную документацию, но все еще не могу понять, в чем здесь проблема: я добавил зависимость через Maven (я также пытался добавить jar в библиотеку проекта вручную, но все равно вызывал ту же проблему), но когда я импортировал класс из Что касается моего класса, IntelliJ говорит, что "пакет com.fazecast.jSerialComm объявлен в модуле com.fazecast.jSerialComm, но модуль com.greeting не читает его".

Он дает мне два варианта: либо добавить его в качестве зависимости Maven, который я уже сделал (он находится в моем pom.xml и может видеть его под зависимостями), либо "добавить директиву com.fazecast.jSerialComm для module-info.java". Если я добавлю requires com.fazecast.jSerialComm, он компилируется нормально, но когда я создаю свою модульную банку и пытаюсь запустить банку с java -p mods/ -m com.greeting/com.mayapp.Runner, он говорит мне "java.lang.module.FindException: модуль com.fazecast.jSerialComm не найден, требуется com.greeting".

Я также попробовал больше jar / зависимостей, которые у меня есть, и это дало мне ту же проблему. Я попробовал Java 9 и 10, также с Gradle, и создал артефакт через 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;
    }

1 ответ

Если вы разрабатываете модуль (как указано вашим module-info.java), все зависимости должны быть обязательными (это быстрое исправление, рекомендованное IntelliJ) и должны находиться на пути к модулю (а не на пути к классам) для компиляции и запуска. Для компиляции Maven, Gradle и IntelliJ делают правильные вещи, и при запуске приложения из IntelliJ, это будет делать то же самое.

Скорее всего, проблема связана с вашим java команда:

java -p mods/ -m com.greeting/com.mayapp.Runner

Это указывает на mods как путь к модулю, но если вы не забыли упомянуть некоторые шаги, которые вы предприняли, эта папка не содержит зависимостей вашего приложения, поэтому, когда Java ищет их, она не находит их - таким образом, сообщение об ошибке.

Чтобы поместить ваши зависимости в эту папку, вы можете скопировать их вручную (не забывайте о транзитивных зависимостях) или использовать Maven's copy-dependencies моджо для этого:

<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 и тогда ваша команда должна работать.

Другие вопросы по тегам