Eclipse Oxy Release 1a + Java 9 + Maven项目无法正常工作

Bas*_*sit 5 eclipse maven-3 java-9

我尝试了用含氧1a Release的Java 9。就简单Java 9项目而言。这是工作。这是Java 9简单程序的屏幕截图

Eclipse中没有Maven的Java 9

这是我的Welcome.java。可以看出我在该程序中使用了Java 9功能

package com.jdojo.intro;

public class Welcome {

    public static void main(String[] args) {

        System.out.println("Welcome to the Module System.");

        // Print the module name of the Welcome class
        Class<Welcome> cls = Welcome.class;
        Module mod = cls.getModule();
        String moduleName = mod.getName();
        System.out.format("Module Name: %s%n", moduleName);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在Java 9的Maven项目中,我遇到了问题。我用maven创建了几乎相同的项目。这是我的pom.xml文件。我也使用了junit 5依赖

<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>pk.training.basit</groupId>
    <artifactId>Ch3-02-HelloWorldMaven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Ch3-02-HelloWorldMaven</name>
    <url>http://maven.apache.org</url>

    <properties>

        <java-version>9</java-version>

        <!-- Unit testing -->
        <junit.version>4.12</junit.version>
        <junit-jupiter-engine.version>5.0.1</junit-jupiter-engine.version>
        <junit-platform-runner.version>1.0.1</junit-platform-runner.version>

        <!-- Logging -->
        <log4j.version>2.9.1</log4j.version>
        <jboss-logging.version>3.3.1.Final</jboss-logging.version>

        <junit-jupiter-engine.version>5.0.1</junit-jupiter-engine.version> 

        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
        <maven-surefire-plugin.version>2.20</maven-surefire-plugin.version>
        <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
        <maven-failsafe-plugin.version>2.20</maven-failsafe-plugin.version>
        <maven-javadoc-plugin.version>2.10.4</maven-javadoc-plugin.version>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </properties>

    <dependencies>

        <!-- Unit Testing  -->

        <!-- JUnit Jupiter test engine implementation, only required at runtime. -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-jupiter-engine.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>${junit-platform-runner.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Logging-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
            <scope>compile</scope>
        </dependency>
        ......
</dependencies>

<build>
    <pluginManagement>
        <plugins>

            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-enforcer-plugin</artifactId>
                                    <versionRange>[1.0.0,)</versionRange>
                                    <goals>
                                        <goal>enforce</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

    <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
                <source>${java-version}</source>
                <target>${java-version}</target>
                <compilerArgument>-Xlint:all</compilerArgument>
                <showWarnings>true</showWarnings>
                <showDeprecation>true</showDeprecation>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>${exec-maven-plugin.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>pk.training.basit.HelloFXApp</mainClass>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>${maven-failsafe-plugin.version}</version>
            <executions>
                <execution>
                    <id>integration-test</id>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>${maven-javadoc-plugin.version}</version>
            <configuration>
                <additionalparam>-Xdoclint:none</additionalparam>
            </configuration>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

屏幕截图中可以看到项目结构。这是我的AppTest.java

package pk.training.basit;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class AppTest {

    @Test
    void myFirstTest() {
        assertEquals(2, 1 + 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果module-info.java中没有文件src/main/java。然后运行此测试用例。只需右键单击并选择Run As--> Junit Test。如果我选择了Java文件,则Welcome.java选择Run As --> Java Application。然后我得到以下输出

Welcome to the Module System.
Module Name: null
Run Code Online (Sandbox Code Playgroud)

没关系 因为现在正在考虑上课路径。并且模块路径上没有模块。因此模块名称为null。但是,一旦我module-info.javasrc/main/java/文件夹中介绍。事情开始变得混乱。这是我尝试过的module-info.java。首先我尝试了

module pk.training.basit {

}
Run Code Online (Sandbox Code Playgroud)

与我的第一个没有maven的项目相同。我在AppTest.java中遇到错误。导入无法解决。现在,如果我右键单击,Welcome.java然后选择Run As --> Java Application。它说存在错误要继续。如果我选择是。我得到以下输出

Error occurred during initialization of boot layer
java.lang.module.FindException: Module pk.training.basit not found
Run Code Online (Sandbox Code Playgroud)

现在,如果我删除自己的module-info.java。然后右键单击我的项目名称,Ch3-02-HelloWorldMaven然后选择Configure --> Create module-info.java。它要求我输入模块名称。如果输入模块名称pk.training.basit,然后单击确定Finish。然后是结果

Java 9 Maven错误

现在,如果我再次尝试运行Welcome.java。我得到错误

Error occurred during initialization of boot layer
java.lang.module.FindException: Module pk.training.basit not found
Run Code Online (Sandbox Code Playgroud)

现在,如果我删除了AppTest.java。并更改module-info.java为此

module pk.training.basit {
    exports pk.training.basit;
    //requires org.junit.jupiter.api;
}
Run Code Online (Sandbox Code Playgroud)

并尝试运行Welcome.java。尽管现在项目中没有错误。我得到了输出

Error occurred during initialization of boot layer
java.lang.module.FindException: Module pk.training.basit not found
Run Code Online (Sandbox Code Playgroud)

我不知道我在做什么错。或者Maven或Eclipse有问题。但是在这里,我尝试使用日食氧气1a,Maven和日食。

我也只有Java 9 GA。我的机器上没有Java 8或Java 7。对于仅Java 9,我必须将此包含在eclipse.ini文件中。-vm C:\Program Files\Java\jdk-9\bin\javaw.exe

....
openFile
--launcher.appendVmargs
-vm
C:\Program Files\Java\jdk-9\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-XX:+UseG1GC
....
Run Code Online (Sandbox Code Playgroud)

如果我做错了。那请告诉我

另外,在eclipse中的一个项目中,您最多只能有一个module-info.java文件。就像我们考虑这个链接Java 9多模块项目一样。然后,对于多模块项目,结构为项目根文件夹。然后,在项目根文件夹中,一个模块有一个源文件夹。和另一个模块的另一个源文件夹。两个源文件夹都有其自己的module-info.java文件。

但是,如果我试图在日食中做同样的事情。然后我得到了错误。在类路径上找到多个modules-info.java文件。

就像您有一个Maven项目一样。哪个管理所有依赖项。像spring,apache等。在这个项目中,您有一个源文件夹module.web,其中包含与Web模块相关的Java文件以及其自己的module-info.java。您还有另一个源文件夹module.service。其中包含自己的模块-info.java。

但是似乎您无法在单个项目的Eclipse中做到这一点。我不知道它是否有效,但是我尝试了一下,但我发现您无法以这种方式在日食中使用它。

无论如何,如果我做错了,请告诉我。

谢谢。