Java 如何使用Maven和NetBeans将应用程序打包到JPMS模块中?
我的目标是使用jlink将一个应用程序打包成一个模块化的运行时映像,该映像与一个定制的JRE捆绑在一起。我的应用程序是一个简单的“hello world”Java标准版应用程序,依赖于Guava。我使用JDK11 基本上,我尝试复制,但使用NetBeans、Maven来管理依赖项,以及使用模块系统构建的版本3.8.1 目录结构: module-info.java文件:Java 如何使用Maven和NetBeans将应用程序打包到JPMS模块中?,java,maven,netbeans,java-platform-module-system,jdeps,Java,Maven,Netbeans,Java Platform Module System,Jdeps,我的目标是使用jlink将一个应用程序打包成一个模块化的运行时映像,该映像与一个定制的JRE捆绑在一起。我的应用程序是一个简单的“hello world”Java标准版应用程序,依赖于Guava。我使用JDK11 基本上,我尝试复制,但使用NetBeans、Maven来管理依赖项,以及使用模块系统构建的版本3.8.1 目录结构: module-info.java文件: module TestwithJLink { requires guava; exports net.clem
module TestwithJLink {
requires guava;
exports net.clementlevallois.testwithjlink;
}
Controller.java:
package net.clementlevallois.testwithjlink;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
public class Controller {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Multiset<String> test = HashMultiset.create();
test.add("hello");
test.add("world");
System.out.println("test: "+ test.toString());
}
}
package net.clementlevallois.testwithjlink;
导入com.google.common.collect.HashMultiset;
导入com.google.common.collect.Multiset;
公共类控制器{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
Multiset test=HashMultiset.create();
test.add(“hello”);
测试。添加(“世界”);
System.out.println(“test:+test.toString());
}
}
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.clementlevallois</groupId>
<artifactId>TestwithJLink</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
<id>compile</id>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
</project>
4.0.0
net.clementlevalois
用jLink测试
1.0-快照
罐子
番石榴
番石榴
18
org.apache.maven.plugins
maven编译器插件
3.8.1
11
11
编译
编译
UTF-8
11
11
但是它创建编译类,没有JAR或模块。所以我不能再深入了(先用jdep分析jar的模块,然后再使用jlink)。我肯定遗漏了一些明显的东西,但什么?如果要创建JAR文件,请转到终端中包含pom.xml的根文件夹并键入:
mvn package
这将在目标文件夹中创建一个JAR。
现在更改终端到目标文件夹的路径,并使用以下命令运行JAR文件:
java -jar {file-name-version}.jar
终于明白了。情景:
- 从NetBeans开始工作,依赖项由Maven处理
- 你的应用程序有一个module-info.java声明
- 您的依赖项还具有module-info.java声明
- 在pom中列出这3个Maven插件(见下文)。注意插件的版本号!特别是,
中的maven依赖项插件
确保您的依赖项与module-info.java文件打包在一起,而不是打包在一起!()resolve
- 编译完成后,将应用程序的jar移动到lib文件夹中,您的依赖项的所有jar都已位于该文件夹中
- 从lib文件夹的父文件夹中,运行:
java--modulepath lib--module name of yourmodule
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.clementlevallois</groupId>
<artifactId>TestwithJLink</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>net.clementlevallois</groupId>
<artifactId>utils</artifactId>
<version>1.0</version>
<type>jar</type>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>resolve</goal>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<archive>
<manifest>
<mainClass>net.clementlevallois.testwithjlink.Controller</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
<id>compile</id>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
</project>
4.0.0
net.clementlevalois
用jLink测试
1.0-快照
罐子
net.clementlevalois
乌提尔斯
1
罐子
maven依赖插件
安装
决定
复制依赖项
${project.build.directory}/lib
org.apache.maven.plugins
maven jar插件
3.1.2
net.clementlevallois.testwithjlink.Controller
org.apache.maven.plugins
maven编译器插件
3.8.1
11
11
编译
编译
UTF-8
11
11
java-jar
无法工作,因为没有定义主类,并且存在依赖项,这些依赖项需要在模块路径上列出,并且类和模块路径都不能使用-jar
选项。thx!如果想直接从NetBeans打包呢?(在保持JPMS逻辑完整的同时)请参见此答案。看看你眼前的问题。除此之外,请注意,为了使用jlink
所有内容都需要是一个显式的模块(清单中的自动模块名称是不够的)。番石榴18不是,我不确定最新的版本是否是。