根据Is there a way to add maven dependencies while using the maven-jlink-plugin? 有没有人在Java 11中将ModiTect Maven plug-in与JavaFX一起使用过?我尝试将maven-jlink-plugin与以下内容一起使用:
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jlink-plugin</artifactId>
<version>3.0.0-alpha-1</version>
<extensions>true</extensions>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.2</version> <!-- Use newer version of ASM -->
</dependency>
</dependencies>
</plugin>
但是得到了:
--- maven-jlink-plugin:3.0.0-alpha-1:jlink (default-jlink) @ test33 ---
Toolchain in maven-jlink-plugin: jlink [ C:\Program Files\Java\jdk-11\bin\jlink.exe ]
The following dependencies will be linked into the runtime image:
-> module: javafx.controlsEmpty ( C:\Users\md\.m2\repository\org\openjfx\javafx-controls\11-ea+25\javafx-controls-11-ea+25.jar )
-> module: javafx.controls ( C:\Users\md\.m2\repository\org\openjfx\javafx-controls\11-ea+25\javafx-controls-11-ea+25-win.jar )
-> module: javafx.graphicsEmpty ( C:\Users\md\.m2\repository\org\openjfx\javafx-graphics\11-ea+25\javafx-graphics-11-ea+25.jar )
-> module: javafx.graphics ( C:\Users\md\.m2\repository\org\openjfx\javafx-graphics\11-ea+25\javafx-graphics-11-ea+25-win.jar )
-> module: javafx.baseEmpty ( C:\Users\md\.m2\repository\org\openjfx\javafx-base\11-ea+25\javafx-base-11-ea+25.jar )
-> module: javafx.base ( C:\Users\md\.m2\repository\org\openjfx\javafx-base\11-ea+25\javafx-base-11-ea+25-win.jar )
-> module: javafx.fxmlEmpty ( C:\Users\md\.m2\repository\org\openjfx\javafx-fxml\11-ea+25\javafx-fxml-11-ea+25.jar )
-> module: javafx.fxml ( C:\Users\md\.m2\repository\org\openjfx\javafx-fxml\11-ea+25\javafx-fxml-11-ea+25-win.jar )
-> module: javafx.mediaEmpty ( C:\Users\md\.m2\repository\org\openjfx\javafx-media\11-ea+25\javafx-media-11-ea+25.jar )
-> module: javafx.media ( C:\Users\md\.m2\repository\org\openjfx\javafx-media\11-ea+25\javafx-media-11-ea+25-win.jar )
Error: automatic module cannot be used with jlink: javafx.mediaEmpty from file:///C:/Users/mduso/.m2/repository/org/openjfx/javafx-media/11-ea+25/javafx-media-11-ea+25.jar
通过阅读另一篇文章,我知道我必须生成模块信息,但是希望有人已经在其pom中使用ModiTect Maven插件来为他们每次自动进行操作。
我将在我所有学生的所有程序中使用JavaFX,并且不想让他们每次都为所有JavaFX模块手动进行操作。
已编辑
我尝试了以下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>md</groupId>
<artifactId>test33</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test33</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mainClass>md.test33.MainApp</mainClass>
</properties>
<organization>
<!-- Used as the 'Vendor' for JNLP generation -->
<name>Your Organisation</name>
</organization>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11-ea+25</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11-ea+25</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- sets up the version of Java you are running and complines the Code -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release> <!-- or <release>10</release>-->
</configuration>
</plugin>
<!-- used to make the program run -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>${mainClass}</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.moditect</groupId>
<artifactId>moditect-maven-plugin</artifactId>
<version>1.0.0.Beta1</version>
<executions>
<execution>
<id>add-module-info-to-dependencies</id>
<phase>package</phase>
<configuration>
<outputDirectory>${project.build.directory}/modules</outputDirectory>
<modules>
<module>
<moduleInfo>
<name>md.test33.MainApp</name>
</moduleInfo>
</module>
<module>
<artifact>
<groupId>org.openjfx</groupId>
<artifactId>javafx.controls</artifactId>
<version>11-ea+25</version>
</artifact>
</module>
<module>
<artifact>
<groupId>org.openjfx</groupId>
<artifactId>javafx.graphics</artifactId>
<version>11-ea+25</version>
</artifact>
</module>
</modules>
</configuration>
<goals>
<goal>add-module-info</goal>
</goals>
</execution>
<execution>
<id>create-runtime-image</id>
<phase>package</phase>
<goals>
<goal>create-runtime-image</goal>
</goals>
<configuration>
<modulePath>
<path>${project.build.directory}/modules</path>
</modulePath>
<modules>
<module>md.test33.MainApp</module>
<module>javafx.controls</module>
<module>javafx.graphics</module>
</modules>
<launcher>
<name>test33</name>
<module>md.test33.MainApp</module>
</launcher>
<compression>2</compression>
<stripDebug>true</stripDebug>
<outputDirectory>${project.build.directory}/jlink-image</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
但是我遇到了这个错误:
Failed to execute goal org.moditect:moditect-maven-plugin:1.0.0.Beta1:add-module-info (add-module-info-to-dependencies) on project test33: Failure to find org.openjfx:javafx.controls:jar:11-ea+25 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.moditect:moditect-maven-plugin:1.0.0.Beta1:add-module-info (add-module-info-to-dependencies) on project test33: Failure to find org.openjfx:javafx.controls:jar:11-ea+25 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: Failure to find org.openjfx:javafx.controls:jar:11-ea+25 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
at org.moditect.mavenplugin.util.ArtifactResolutionHelper.resolveArtifact(ArtifactResolutionHelper.java:77)
at org.moditect.mavenplugin.util.ArtifactResolutionHelper.resolveArtifact(ArtifactResolutionHelper.java:57)
at org.moditect.mavenplugin.add.AddModuleInfoMojo.resolveArtifactsToBeModularized(AddModuleInfoMojo.java:185)
at org.moditect.mavenplugin.add.AddModuleInfoMojo.execute(AddModuleInfoMojo.java:113)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
... 20 more
Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Failure to find org.openjfx:javafx.controls:jar:11-ea+25 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:444)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:246)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:223)
at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:294)
at org.moditect.mavenplugin.util.ArtifactResolutionHelper.resolveArtifact(ArtifactResolutionHelper.java:74)
... 25 more
Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Failure to find org.openjfx:javafx.controls:jar:11-ea+25 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
at org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.newException(DefaultUpdateCheckManager.java:231)
at org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.checkArtifact(DefaultUpdateCheckManager.java:206)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.gatherDownloads(DefaultArtifactResolver.java:585)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:503)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:421)
... 29 more
有任何想法吗?还是我应该等到Java11完全发布,并希望有人将模块信息添加到JavaFX文件中?
答案 0 :(得分:5)
我为带有OpenJFX 11的OpenJDK11和带有moditect插件的自动生成的modul-info.class添加了一个完整的示例(单击here!)
尝试一下:
注意:moduleName属性必须与模块信息文件中的相同
<?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>md</groupId>
<artifactId>test33</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test33</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mainClass>md.test33.MainApp</mainClass>
<moduleName>md</moduleName>
</properties>
<organization>
<!-- Used as the 'Vendor' for JNLP generation -->
<name>Your Organisation</name>
</organization>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11-ea+25</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- sets up the version of Java you are running and complines the Code -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release> <!-- or <release>10</release>-->
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.2.1</version> <!-- Use newer version of ASM -->
</dependency>
</dependencies>
</plugin>
<!-- used to make the program run -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/bin/java</executable>
<arguments>
<argument>--module-path</argument>
<argument>
${project.build.directory}/modules
</argument>
<argument>--module</argument>
<argument>${moduleName}/${mainClass}</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<outputDirectory>
${project.build.directory}/modules
</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.moditect</groupId>
<artifactId>moditect-maven-plugin</artifactId>
<version>1.0.0.Beta1</version>
<executions>
<execution>
<id>create-runtime-image</id>
<phase>package</phase>
<goals>
<goal>create-runtime-image</goal>
</goals>
<configuration>
<modulePath>
<path>${project.build.directory}/modules</path>
</modulePath>
<modules>
<module>${moduleName}</module>
<!-- <module>javafx.controls</module>
<module>javafx.graphics</module> -->
</modules>
<launcher>
<name>test33</name>
<module>${moduleName}/${mainClass}</module>
</launcher>
<compression>2</compression>
<stripDebug>true</stripDebug>
<outputDirectory>${project.build.directory}/jlink-image</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/modules</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
modul-info.java
module md {
requires javafx.fxml;
requires javafx.controls;
requires javafx.graphics;
requires javafx.base;
opens md.test33;
}