Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Maven和NetBeans将应用程序打包到JPMS模块中?_Java_Maven_Netbeans_Java Platform Module System_Jdeps - Fatal编程技术网

Java 如何使用Maven和NetBeans将应用程序打包到JPMS模块中?

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

我的目标是使用jlink将一个应用程序打包成一个模块化的运行时映像,该映像与一个定制的JRE捆绑在一起。我的应用程序是一个简单的“hello world”Java标准版应用程序,依赖于Guava。我使用JDK11

基本上,我尝试复制,但使用NetBeans、Maven来管理依赖项,以及使用模块系统构建的版本3.8.1

目录结构:

module-info.java文件:

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依赖项插件
    中的
    resolve
    确保您的依赖项与module-info.java文件打包在一起,而不是打包在一起!()
  • 编译完成后,将应用程序的jar移动到lib文件夹中,您的依赖项的所有jar都已位于该文件夹中
您可以使用NetBeans中的run图标直接运行此应用程序,或者:

  • 从lib文件夹的父文件夹中,运行:
    java--modulepath lib--module name of yourmodule
POM:

<?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不是,我不确定最新的版本是否是。