Получение ошибки Модуль не найден в модуле-info.java с Maven

Я получаю module not found при компиляции с помощью maven. Это простой проект для тестирования некоторых концепций, его можно найти здесь на Github. Вот ошибки:

/home/TestQuerydsl/src/main/java/module-info.java:2: error: module not found: javafx.controls
    requires javafx.controls;
                   ^
/home/TestQuerydsl/src/main/java/module-info.java:3: error: module not found: javafx.fxml
    requires javafx.fxml;
                   ^
/home/TestQuerydsl/src/main/java/module-info.java:4: error: module not found: java.persistence
    requires java.persistence;

Полный модуль-info.java

module com.intelidia.testquerydsl {
    requires javafx.controls;
    requires javafx.fxml;
    requires java.persistence;


    opens com.intelidia.testquerydsl to javafx.fxml;
    exports com.intelidia.testquerydsl;
}

Полный 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.intelidia.testquerydsl</groupId>
    <artifactId>TestQuerydsl</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>TestQuerydsl</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.10.0</junit.version>
        <querydsl.version>5.1.0</querydsl.version>
    </properties>


    <dependencies>


        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
        </dependency>

        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>








        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>17.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>17.0.6</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>



            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>






            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>
                                com.intelidia.testquerydsl.testquerydsl/com.intelidia.testquerydsl.testquerydsl.HelloApplication
                            </mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Помогает ли это: openjfx.io/openjfx-docs/maven ? Похоже, у вас нет файлов JAR JavaFX. Можете ли вы проверить?

Abra 21.05.2024 05:47

@Abra, я уже поместил объявления в maven, нужны ли мне еще файлы jar, я не эксперт в maven, но разве не предполагается заменить добавление jar вручную и управлять этими зависимостями?

Noor 21.05.2024 05:59

@Slaw, спасибо, что попробовал, у меня такая же ситуация, как и у тебя, я постараюсь разобраться module-info.java

Noor 21.05.2024 08:42

@Slaw, я заметил, что удаление apt-maven-plugin из pom.xml решает проблему, но мне нужен этот плагин

Noor 21.05.2024 09:28

Если вы удалите плагин, классы Q из Querydsl не будут созданы. В ссылке, которой вы поделились, написано следующее: «А теперь настройте плагин Maven APT:»…

Noor 21.05.2024 11:04

Подумайте, должно ли ваше приложение быть модульным. Если нет, вы можете удалить зависимости модуля-информации и JavaFX и использовать JDK, включающий JavaFX, например некоторые дистрибутивы Azul или Liberica.

jewelsea 21.05.2024 12:40

@jewelsea, если я удалю module-info, я обязательно буду использовать JDK, который уже включает JavaFX?

Noor 21.05.2024 19:31

«если я удалю module-info, я обязательно буду использовать JDK, который уже включает JavaFX?» -> Нет, вы можете следовать инструкциям по началу работы для немодульных приложений JavaFX в OpenJDK, которые представлены на openjfx.io, если вы не хотите использовать JDK, включающий JavaFX.

jewelsea 21.05.2024 19:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
188
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обратите внимание, что ответ ниже предполагает, что вы хотите или хотите, чтобы ваш проект был модульным. Если это не так, то самое простое решение — просто удалить файл module-info.java. Кроме того, некоторые из ваших зависимостей немодульны. Зависимость от автоматических модулей сводит на нет многие преимущества модульного кода (например, jlink не может работать с автоматическими модулями). Также см. комментарий Jewelsea о возможном использовании JDK, включающего JavaFX.

Независимо от того, сохраняете ли вы свой код модульным или нет, я все равно предлагаю удалить apt-maven-plugin и вместо этого перенести конфигурацию процессора аннотаций в maven-compiler-plugin.


Ошибки «модуль не найден» выдаются плагином com.mysema.maven:apt-maven-plugin. Репозиторий этого плагина был заархивирован в 2021 году, а в последней версии на Maven Central говорится, что он был опубликован 9 лет назад, в 2015 году (обратите внимание, что Java 9 была выпущена в 2017 году). Я не уверен, почему в документации querydsl-jpa все еще говорится о необходимости его применения. Возможно, кто-то, более знакомый с Querydsl, может дать некоторые разъяснения, потому что удаление этого плагина и настройка обработчика аннотаций в плагине maven-compiler-plugin, похоже, работает так же хорошо:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>11</source>
        <target>11</target>
        <annotationProcessors>
            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
        </annotationProcessors>
    </configuration>
</plugin>

Или, по крайней мере, это устраняет ошибки «модуль не найден». Но теперь это терпит неудачу:

l error compiling: java.lang.NoClassDefFoundError: javax/persistence/Entity: javax.persistence.Entity

Насколько я могу судить, эта ошибка вызвана следующим:

  1. При компиляции модуля процессоры аннотаций, выбранные из пути к классам или пути к процессору, не могут найти классы в пути к модулю (не знаю, документировано ли это где-нибудь). В вашем проекте есть файл module-info.java, поэтому вы компилируете модуль.

  2. Maven размещает зависимость javax.persistence-api только на пути к модулю.

  3. Зависимость querydsl-apt не имеет транзитивной зависимости от javax.persistence-api.

Похоже, что один из способов исправить это — явно указать путь к процессору:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>11</source>
        <target>11</target>
        <annotationProcessorPaths>
            <path>
                <groupId>com.querydsl</groupId>
                <artifactId>querydsl-apt</artifactId>
                <version>${querydsl.version}</version>
            </path>
            <path>
                <groupId>javax.persistence</groupId>
                <artifactId>javax.persistence-api</artifactId>
                <version>2.2</version>
            </path>
        </annotationProcessorPaths>
        <annotationProcessors>
            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
        </annotationProcessors>
    </configuration>
</plugin>

Мы приближаемся, но теперь это не удается:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project TestQuerydsl: Compilation failure: Compilation failure:
[ERROR] /C:/Users/koles/Desktop/TestQueryDSL/target/generated-sources/annotations/com/intelidia/testquerydsl/testquerydsl/models/QUser.java:[3,32] package com.querydsl.core.types is not visible
[ERROR]   (package com.querydsl.core.types is declared in the unnamed module, but module com.intelidia.testquerydsl does not read it)
[ERROR] /C:/Users/koles/Desktop/TestQueryDSL/target/generated-sources/annotations/com/intelidia/testquerydsl/testquerydsl/models/QUser.java:[5,31] package com.querydsl.core.types.dsl is not visible
[ERROR]   (package com.querydsl.core.types.dsl is declared in the unnamed module, but module com.intelidia.testquerydsl does not read it)
[ERROR] /C:/Users/koles/Desktop/TestQueryDSL/target/generated-sources/annotations/com/intelidia/testquerydsl/testquerydsl/models/QUser.java:[7,25] package com.querydsl.core.types is not visible
[ERROR]   (package com.querydsl.core.types is declared in the unnamed module, but module com.intelidia.testquerydsl does not read it)
[ERROR] /C:/Users/koles/Desktop/TestQueryDSL/target/generated-sources/annotations/com/intelidia/testquerydsl/testquerydsl/models/QUser.java:[8,24] package javax.annotation.processing is not visible
[ERROR]   (package javax.annotation.processing is declared in module java.compiler, but module com.intelidia.testquerydsl does not read it)
[ERROR] /C:/Users/koles/Desktop/TestQueryDSL/target/generated-sources/annotations/com/intelidia/testquerydsl/testquerydsl/models/QUser.java:[9,25] package com.querydsl.core.types is not visible
[ERROR]   (package com.querydsl.core.types is declared in the unnamed module, but module com.intelidia.testquerydsl does not read it)

Чтобы исправить это, нужно изменить файл module-info.java, добавив следующее:

requires static java.compiler;
requires com.querydsl.core;

Это необходимо, поскольку сгенерированный код компилируется в ваш модуль.

  • Сгенерированный код включает аннотацию javax.annotation.processing.Generated. Эта аннотация взята из модуля java.compiler. Но аннотация требуется только во время компиляции, поэтому используется requires static вместо requires.

  • Сгенерированный код использует множество типов из com.querydsl.core.

После внесения всех этих изменений запуск ./mvnw compile завершается успешно и создаются ожидаемые источники. Но с исполнением javafx:run всё равно есть проблемы. У вас неправильное имя модуля в POM; должен быть:

<mainClass>
    com.intelidia.testquerydsl/com.intelidia.testquerydsl.testquerydsl.HelloApplication
</mainClass>

И вам нужно добавить еще две директивы в ваш module-info.java файл:

exports com.intelidia.testquerydsl.testquerydsl to javafx.graphics;
opens com.intelidia.testquerydsl.testquerydsl to javafx.fxml;

И, наконец, выполнение ./mvnw compile javafx:run должно сработать.


Полный код

Вот новинка module-info.java:

module com.intelidia.testquerydsl {
    requires static java.compiler;
    requires com.querydsl.core;
    requires java.persistence;
    requires javafx.controls;
    requires javafx.fxml;


    exports com.intelidia.testquerydsl.testquerydsl to 
            javafx.graphics;

    opens com.intelidia.testquerydsl.testquerydsl to 
            javafx.fxml;
}

И новинка 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.intelidia.testquerydsl</groupId>
    <artifactId>TestQuerydsl</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>TestQuerydsl</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.release>11</maven.compiler.release>

        <javafx.version>17.0.6</javafx.version>
        <javax.persistence.version>2.2</javax.persistence.version>
        <querydsl.version>5.1.0</querydsl.version>
        <junit.version>5.10.0</junit.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>${javax.persistence.version}</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>com.querydsl</groupId>
                            <artifactId>querydsl-apt</artifactId>
                            <version>${querydsl.version}</version>
                        </path>
                        <path>
                            <groupId>javax.persistence</groupId>
                            <artifactId>javax.persistence-api</artifactId>
                            <version>${javax.persistence.version}</version>
                        </path>
                    </annotationProcessorPaths>
                    <annotationProcessors>
                        <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                    </annotationProcessors>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>
                                com.intelidia.testquerydsl/com.intelidia.testquerydsl.testquerydsl.HelloApplication
                            </mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

 

работает безупречно, спасибо за время, которое вы потратили на изучение этого вопроса, за предоставленный ответ и объяснения!

Noor 21.05.2024 15:15

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