Я получаю 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>
@Abra, я уже поместил объявления в maven, нужны ли мне еще файлы jar, я не эксперт в maven, но разве не предполагается заменить добавление jar вручную и управлять этими зависимостями?
@Slaw, спасибо, что попробовал, у меня такая же ситуация, как и у тебя, я постараюсь разобраться module-info.java
@Slaw, я заметил, что удаление apt-maven-plugin из pom.xml решает проблему, но мне нужен этот плагин
Если вы удалите плагин, классы Q из Querydsl не будут созданы. В ссылке, которой вы поделились, написано следующее: «А теперь настройте плагин Maven APT:»…
Подумайте, должно ли ваше приложение быть модульным. Если нет, вы можете удалить зависимости модуля-информации и JavaFX и использовать JDK, включающий JavaFX, например некоторые дистрибутивы Azul или Liberica.
@jewelsea, если я удалю module-info, я обязательно буду использовать JDK, который уже включает JavaFX?
«если я удалю module-info, я обязательно буду использовать JDK, который уже включает JavaFX?» -> Нет, вы можете следовать инструкциям по началу работы для немодульных приложений JavaFX в OpenJDK, которые представлены на openjfx.io, если вы не хотите использовать JDK, включающий JavaFX.




Обратите внимание, что ответ ниже предполагает, что вы хотите или хотите, чтобы ваш проект был модульным. Если это не так, то самое простое решение — просто удалить файл 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
Насколько я могу судить, эта ошибка вызвана следующим:
При компиляции модуля процессоры аннотаций, выбранные из пути к классам или пути к процессору, не могут найти классы в пути к модулю (не знаю, документировано ли это где-нибудь). В вашем проекте есть файл module-info.java, поэтому вы компилируете модуль.
Maven размещает зависимость javax.persistence-api только на пути к модулю.
Зависимость 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>
работает безупречно, спасибо за время, которое вы потратили на изучение этого вопроса, за предоставленный ответ и объяснения!
Помогает ли это: openjfx.io/openjfx-docs/maven ? Похоже, у вас нет файлов JAR JavaFX. Можете ли вы проверить?