我正在使用带有JDK 12.0.1和org.beryx.jlink
插件(2.10.4)的Gradle(4.10.3,但我已经尝试了5.4.1之前的大多数版本),但是每次尝试创建时都会遇到此错误jlink图片:
当我单击进入在合并的module-info.java
中引发错误的行时,它指向以下两个:
provides org.apache.xmlbeans.impl.store.PathDelegate.SelectPathInterface with org.apache.xmlbeans.impl.xpath.saxon.XBeansXPath;
provides org.apache.xmlbeans.impl.store.QueryDelegate.QueryInterface with org.apache.xmlbeans.impl.xquery.saxon.XBeansXQuery;
我的
build.gradle
文件如下所示:plugins {
id 'application'
id 'idea'
id 'java'
id 'org.openjfx.javafxplugin' version '0.0.7'
id 'org.beryx.jlink' version '2.10.4'
}
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-csv:1.6'
compile 'org.apache.poi:poi-ooxml:4.1.0'
compile 'com.fasterxml.jackson.core:jackson-core:2.9.9'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.9.9'
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.9'
testCompile 'org.junit.jupiter:junit-jupiter-api:5.5.0-M1'
testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.5.0-M1'
}
// ### Application plugin settings
application {
mainClassName = "$moduleName/path.to.myapp"
}
// ### Idea plugin settings
idea {
module {
outputDir = file("out/production/classes")
}
}
// ### Java plugin settings
sourceCompatibility = JavaVersion.VERSION_11
compileJava {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
test {
useJUnitPlatform()
testLogging {
events 'PASSED', 'FAILED', 'SKIPPED'
}
}
// ### JavaFX plugin settings
javafx {
version = "12.0.1"
modules = ['javafx.controls', 'javafx.fxml']
}
// ### jlink plugin settings
jlink {
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
launcher {
name = 'myapp'
}
}
关于如何解决此问题的任何想法?
最佳答案
以下可能的解决方案仅基于您的构建文件,而不了解您的模块信息或项目的代码,因此它可能不起作用。
它也基于jlink插件存储库中的issue。
首先,让我解释一下该插件的工作方式:由于(JDK)jlink
工具不允许非模块化的依赖关系,因此该插件将尝试收集所有插件并动态创建一个模块,然后可以将其添加到该模块中。 -路径。该模块名为$yourModuleName.mergedModule
。
现在,我将您的依赖项添加到一个简单的JavaFX项目中。当我运行./gradlew jlink
时,出现与您发布的错误相同的错误。如果检查错误:
这表明创建的模块名为myapp.merged.module
,并且它具有module-info
描述符。如果打开它,您将看到所有的exports
(默认情况下,模块将导出依赖项的每个包),requires
和provides
:
open module myapp.merged.module {
exports com.fasterxml.jackson.annotation;
exports com.fasterxml.jackson.core;
exports com.fasterxml.jackson.core.async;
...
exports schemaorg_apache_xmlbeans.system.sXMLTOOLS;
requires java.xml.crypto;
requires java.logging;
requires java.sql;
requires java.xml;
requires java.desktop;
requires java.security.jgss;
requires jdk.javadoc;
uses java.nio.file.spi.FileSystemProvider;
provides com.fasterxml.jackson.core.JsonFactory with com.fasterxml.jackson.core.JsonFactory;
provides com.fasterxml.jackson.core.ObjectCodec with com.fasterxml.jackson.databind.ObjectMapper;
provides org.apache.xmlbeans.impl.store.QueryDelegate.QueryInterface with org.apache.xmlbeans.impl.xquery.saxon.XBeansXQuery;
provides org.apache.xmlbeans.impl.store.PathDelegate.SelectPathInterface with org.apache.xmlbeans.impl.xpath.saxon.XBeansXPath;
}
所以现在的问题是:您应该在自己的模块中添加更多需求吗?答案解释为here:这将不必要地增加项目的大小。更好的方法是使用
mergedModule
脚本块:和:
如果运行
./gradlew suggestMergedModuleInfo
,则基本上将获得与上述合并模块描述符相同的内容。一个可能的解决方案是开始只向合并的模块描述符中添加一些需求,然后重试。
我开始于:
jlink {
mergedModule {
requires "java.xml"
}
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
launcher {
name = 'myapp'
}
}
我可以成功运行
./gradlew jlink
。如果现在检查合并的模块描述符,它将看起来像:
open module myapp.merged.module {
requires java.xml;
exports com.fasterxml.jackson.annotation;
exports com.fasterxml.jackson.core;
exports com.fasterxml.jackson.core.async;
...
exports schemaorg_apache_xmlbeans.system.sXMLTOOLS;
}
仅包含所有输出的显式
requires
,但不包含provides
,因此错误将消失。由于我没有您的代码,所以我无法说这是否对您有用,但是对于我来说,具有相同的依赖项就可以了。
关于java - Gradle Jlink插件在带有 “the service implementation does not have a default constructor”的createMergedModule期间失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56512064/