我尝试使用eclipse oxygen 1a Release的java 9。至于简单的java 9项目是值得关注的。这是工作。这是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);
}
}
但是使用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>
可以在屏幕截图中看到项目结构。这是我的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);
}
}
如果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
哪个好。因为现在它正在考虑类路径。模块路径上没有模块。所以模块名称为null。但是,只要我在module-info.java
文件夹中引入src/main/java/
即可。事情开始变得混乱。这是我用module-info.java
尝试的内容。首先我尝试了这个
module pk.training.basit {
}
与我没有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
现在,如果我删除module-info.java
。然后右键单击我的项目名称Ch3-02-HelloWorldMaven
并选择Configure --> Create module-info.java
。它要求我提供模块名称。如果我输入我的模块名称pk.training.basit
并点击Finish
。然后是结果
现在,如果我再次尝试运行Welcome.java。我收到了错误
Error occurred during initialization of boot layer
java.lang.module.FindException: Module pk.training.basit not found
现在,如果我删除我的AppTest.java。并将module-info.java
更改为此
module pk.training.basit {
exports pk.training.basit;
//requires org.junit.jupiter.api;
}
尝试运行Welcome.java。虽然现在项目中没有错误。我得到了输出
Error occurred during initialization of boot layer
java.lang.module.FindException: Module pk.training.basit not found
我不知道我做错了什么。或者maven或eclipse有问题。但在这里我尝试使用eclipse氧气1a,Maven和eclipse。
另外我只有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
....
如果我做错了什么。那么请告诉我。
此外,在eclipse中的一个项目中不能有多个module-info.java文件。就像我们考虑这个链接Java 9 multi module project一样。然后对于多模块项目,结构是你有项目根文件夹。然后在项目根文件夹中,您有一个模块的一个源文件夹。另一个模块的另一个源文件夹。两个源文件夹都有自己的module-info.java文件。
但是如果我试图在日食中做同样的事情。然后我得到了错误。在类路径上找到多个modules-info.java文件。
就像这个想法一样,你有一个maven项目。哪个管理所有依赖项。像spring,apache等。在这个项目中,你有一个像module.web
这样的源文件夹,它包含你的web模块相关的java文件和它自己的module-info.java。你有另一个源文件夹module.service。它包含自己的module-info.java。
但似乎你不能在单个项目的eclipse中做到这一点。我不知道它是否有效但是我试过了,我发现你不能以这种方式在日食中做到这一点。
无论如何,如果我做错了,请告诉我。
谢谢。