Модуль не найден: как скомпилировать проект JDK 10 Eclipse Maven с модулем? - PullRequest
0 голосов
/ 31 мая 2018

Ниже приведены основные разделы моего pom.xml:

свойства:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.build.targetEncoding>UTF-8</project.build.targetEncoding>
    <jdk.release>10</jdk.release>
    <jdk.vendor>oracle</jdk.vendor>
    <maven.compiler.source>1.10</maven.compiler.source>
    <maven.compiler.target>1.10</maven.compiler.target>

    <dependency.asm.version>6.2</dependency.asm.version>
    <dependency.log4j2.version>2.11.0</dependency.log4j2.version>

    <plugin.maven-toolchains.version>1.1</plugin.maven-toolchains.version>
    <plugin.maven-compiler.version>3.7.0</plugin.maven-compiler.version>    
    <plugin.maven-dependency.version>3.1.1</plugin.maven-dependency.version>
    <plugin.maven-jar.version>3.1.0</plugin.maven-jar.version>
</properties>

зависимости :

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${dependency.log4j2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${dependency.log4j2.version}</version>
    </dependency>
</dependencies>

плагины :

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-toolchains-plugin</artifactId>
        <version>${plugin.maven-toolchains.version}</version>
        <executions>
            <execution>
                <goals>
                    <goal>toolchain</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <toolchains>
                <jdk>
                    <version>${jdk.release}</version>
                    <vendor>${jdk.vendor}</vendor>
                </jdk>
            </toolchains>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${plugin.maven-compiler.version}</version>
        <configuration>
            <source>${maven.compiler.source}</source>
            <target>${maven.compiler.target}</target>
            <release>${jdk.release}</release>
        </configuration>
        <dependencies>
            <dependency>
                <groupId>org.ow2.asm</groupId>
                <artifactId>asm</artifactId>
                <version>${dependency.asm.version}</version>
            </dependency>
        </dependencies>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>${plugin.maven-dependency.version}</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.basedir}/dist/lib/</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>${plugin.maven-jar.version}</version>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>./lib/</classpathPrefix>
                    <mainClass>com.mycompany.tbe.myproject.Application</mainClass>
                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                    <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                </manifest>
            </archive>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <outputDirectory>${project.basedir}/dist</outputDirectory>
        </configuration>
    </plugin>       
</plugins>

Структура проекта:

project
+
|-- src
|   +
|   |-- main
|   |   +
|   |   |-- java
|   |   |   +
|   |   |   |-- com
|   |   |   |   +
|   |   |   |   |-- mycompany
|   |   |   |   |   +
|   |   |   |   |   |-- tbe
|   |   |   |   |   |   +
|   |   |   |   |   |   |-- myproject
|   |   |   |-- module-info.java
|   |   |-- resources    
|-- pom.xml

module-info.java содержит:

/**
 * @author Tapas Bose
 */
module project {
    exports com.mycompany.tbe.myproject;

    requires log4j.api;
}

Когда я выполняю: mvn clean package, он выдает ошибку, сообщая:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project <my-project>: Compilation failure
[ERROR] <path-to-my-project>/src/main/java/module-info.java:[7,15] error: module not found: log4j.api

Я также попытался ввести аргумент --add-modules в maven-compiler-plugin, указав конфигурацию:

<configuration>
    <compilerArgs>
        <arg>--add-modules</arg>
        <arg>log4j.api</arg>
    </compilerArgs>
</configuration>

Но это тоже не сработало.

Несколько баллов:

Если я удаляю module-info.java, это работает.

module-info.java генерируется Eclipse.

* java describe-module показывает следующее:

$ jar --file=log4j-api-2.11.0.jar --describe-module
releases: 9

No root module descriptor, specify --release

$ jar --file=log4j-api-2.11.0.jar --describe-module --release 9
releases: 9

org.apache.logging.log4j jar:file:///<path-to-maven-local-repository>/org/apache/logging/log4j/log4j-api/2.11.0/log4j-api-2.11.0.jar/!META-INF/versions/9/module-info.class
exports org.apache.logging.log4j
exports org.apache.logging.log4j.message
exports org.apache.logging.log4j.simple
exports org.apache.logging.log4j.spi
exports org.apache.logging.log4j.status
exports org.apache.logging.log4j.util
requires java.base mandated
uses org.apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory
uses org.apache.logging.log4j.spi.Provider
uses org.apache.logging.log4j.util.PropertySource

Следовательно, если изменить module-info.java следующим образом:

/**
 * @author Tapas Bose
 */
module project {
    exports com.mycompany.tbe.myproject;

    requires org.apache.logging.log4j;
}

Eclipse Java Editor начинает показывать ошибку компиляции вфайл module-info.java:

enter image description here

Также в других классах Java, где используются пакеты log4j-api:

enter image description here

Но mvn clean package работает в этом случае с предупреждениемs:

[WARNING] ********************************************************************************************************************
[WARNING] * Required filename-based automodules detected. Please don't publish this project to a public artifact repository! *
[WARNING] ********************************************************************************************************************

Я использую:

  • Eclipse Oxygen.3a Release (4.7.3a)
  • Oracle JDK 10
  • Apache Maven 3.5.2

В другом потоке SO: Модуль Spring Boot не найден Ошибка предлагается очистить локальный репозиторий maven.Я также пытался сделать то же самое, используя mvn clean dependency:purge-local-repository package, но безуспешно.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Мне удалось как-то сделать эту работу.Я использую JDK 10.0.1

  1. Я скачал последнюю версию Eclipse Photon Release (4.8.0), я не знаю, будет ли это исправление работать со старыми версиями.
  2. Iизменил module-info.java, чтобы иметь следующие строки: requires log4j.api; requires org.apache.logging.log4j.core; Я использую версию 2.11.1 log4j.
  3. Я изменил все мои операции импорта, которые говорят import org.apache.logging.log4j.*;, чтобы не использовать подстановочный знак.Поэтому они изменились на: import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;

Вот и все, это работает как с Maven, так и с Eclipse.

0 голосов
/ 04 июня 2018

Проблема заключается в том, что log4j-api-2.11.0.jar - это мульти-релиз jar с модулем-info.class в META-INF / version / 9 / module-info.class, который eclipse не поддерживаетпока что см. https://bugs.eclipse.org/bugs/show_bug.cgi?id=534624

...