在Java 9引入模块化之后,如何将模块化与Maven项目结合成为了许多开发者关注的焦点。本文将通过一个简单的示例,展示如何在Maven项目中开发Java 9模块,并使用非模块化的外部库(如Jsoup)。
首先,我们需要创建一个Maven项目,并在pom.xml
中配置相关的依赖和插件。以下是完整的pom.xml
文件内容:
<project .....>
<modelVersion>4.0.0modelVersion>
<groupId>com.logicbig.examplegroupId>
<artifactId>java9-module-and-apache-mavenartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.jsoupgroupId>
<artifactId>jsoupartifactId>
<version>1.11.3version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.0version>
<configuration>
<source>10source>
<target>10target>
<encoding>UTF-8encoding>
configuration>
plugin>
plugins>
build>
project>
在这个配置中,我们指定了项目的基本信息,添加了Jsoup作为依赖,并配置了maven-compiler-plugin
以支持Java 10的编译。
Java 9模块需要一个module-info.java
文件来声明模块的依赖关系。以下是module-info.java
的内容:
module example.module {
requires org.jsoup;
}
这个文件声明了当前模块依赖于org.jsoup
模块。需要注意的是,Jsoup本身并不是一个模块化的库,因此我们需要将其作为自动模块使用。
由于Jsoup不是模块化的库,我们需要通过jar --describe-module
命令来查找其自动模块名称。在Jsoup的JAR文件中,MANIFEST.MF
文件声明了Automatic-Module-Name: org.jsoup
。这意味着我们可以将Jsoup作为自动模块org.jsoup
来使用。
接下来,我们编写一个简单的主类ExampleMain
,用于演示如何使用Jsoup解析HTML内容。以下是ExampleMain.java
的代码:
package com.logicbig.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class ExampleMain {
public static void main(String[] args) {
Document d = Jsoup.parse("Example");
String s = d.getElementsByTag("a").first().attr("href");
System.out.println(s);
}
}
在这个主类中,我们使用Jsoup解析了一个简单的HTML字符串,并提取了标签的
href
属性。
我们可以通过Maven的exec:java
插件来运行项目。在项目根目录下执行以下命令:
mvn -q clean compile exec:java -Dexec.mainClass="com.logicbig.example.ExampleMain"
如果一切正常,程序将输出http://www.example.com
。
我们也可以通过Java命令直接运行模块化项目。在目标目录下执行以下命令:
java --module-path classes;C:\Users\Joe\.m2\repository\org\jsoup\jsoup\1.11.3 --module example.module/com.logicbig.example.ExampleMain
同样,程序将输出http://www.example.com
。
如果在运行过程中遇到编译错误,例如package org.jsoup does not exist
,可能是因为模块声明文件module-info.java
中缺少requires
语句。确保module-info.java
正确声明了依赖的模块。
此外,如果Maven编译失败并抛出MojoFailureException
,通常是由于依赖问题或代码错误导致的。可以通过查看Maven的错误日志来定位问题。
通过本文的示例,我们展示了如何在Maven项目中开发Java 9模块,并使用非模块化的外部库。通过合理配置pom.xml
和module-info.java
,我们可以轻松地将Java 9模块化特性与Maven项目结合,同时利用现有的非模块化库。希望本文能为正在探索Java 9模块化的开发者提供一些帮助。