我正在使用带有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(默认情况下,模块将导出依赖项的每个包),requiresprovides:

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/

10-09 01:22