Gradleのでランタイムイメージにの依存性を追加します。

GarryMoveOut:

私は、依存関係を追加する方法がわかりません。私のモジュールは、Log4jのを必要とします。私は、モジュールの情報に要件を追加しました。私はGradleの依存関係にも追加しました。私は、プロジェクトを実行することができますが、私は、カスタムランタイムイメージを作成することはできません。

plugins {
    id 'java'
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.5'
}

group 'eu.sample'
version '2.0'


repositories {
    mavenCentral()
}

javafx {
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

mainClassName = "$moduleName/eu.sample.app.Main"

def lin_java_home = hasProperty('org.gradle.java.home') ? getProperty('org.gradle.java.home') : System.getenv('JAVA_HOME')
def lin_fx_jmods = hasProperty('linux.fx.mods') ? getProperty('linux.fx.mods') : System.getenv('PATH_TO_FX_MODS_LIN')

def win_java_home = hasProperty('windows.java.home') ? getProperty('windows.java.home') : System.getenv('JAVA_HOME_WIN')
def win_fx_jmods = hasProperty('windows.fx.mods') ? getProperty('windows.fx.mods') : System.getenv('PATH_TO_FX_MODS_WIN')

dependencies {
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
}

task jlink(type: Exec) {
    dependsOn 'clean'
    dependsOn 'jar'

    workingDir 'build'

    if (lin_java_home == null) {
        throw new RuntimeException("java_home is not defined.")
    }
    if (lin_fx_jmods == null) {
        throw new RuntimeException("fx_jmods is not defined.")
    }
    commandLine "${lin_java_home}/bin/jlink", '--module-path', "libs${File.pathSeparatorChar}${lin_fx_jmods}",
            '--add-modules', "${moduleName}", '--output', "${moduleName}", '--strip-debug',
            '--compress', '2', '--no-header-files', '--no-man-pages'
}

task jlinkWin(type: Exec) {
    dependsOn 'clean'
    dependsOn 'jar'


    workingDir 'build'

    if (win_java_home == null) {
        throw new RuntimeException("java_home is not defined.")
    }
    if (win_fx_jmods == null) {
        throw new RuntimeException("fx_jmods is not defined.")
    }
    commandLine "${lin_java_home}/bin/jlink", '--module-path', 
            "${win_java_home}/jmods${File.pathSeparatorChar}libs${File.pathSeparatorChar}${win_fx_jmods}",
            '--add-modules', "${moduleName}", '--output', "${moduleName}", '--strip-debug',
            '--compress', '2', '--no-header-files', '--no-man-pages'
}

I火タスクがJLINKとき私が得ます:

エラー:アプリで必要とされるモジュールorg.apache.logging.log4j見つかりません、

私はビルドにlibsディレクトリをチェックし、log4jのjarファイルはありません。JLINKタスクに依存関係を追加するためのGradleを伝える方法?

ホセ・ペリーダ:

問題

これは、あなたの中に持っているものであるjlinkタスク:

'--module-path', "libs${File.pathSeparatorChar}${fx_jmods}"

あなたからの依存関係を追加することをいただきました意味:

  • libs:基本的にはあなたのモジュールの瓶helloFXこれは、の結果であるjarその依存関係のみ、プロジェクトのクラスとリソースが含まれているタスク、ではなく。

  • fx_jmods:それはのJavaFX jmodsへのパスです。

あなたが実行したときしかし、このエラーが発生します:

エラー:アプリで必要とされるモジュールorg.apache.logging.log4j見つかりません、

エラー手段があることmodule-pathのためのjlinkコマンドが完了していない、そしてそれは、すべての必要な依存関係を解決することはできません。上述したように、我々は、module.jarとのJavaFX(jmods)ジャーはなく含むれますlog4j.jar

だから我々は、モジュールパスにそのjarファイルを追加する方法を見つける必要があります。

カスタムイメージにサードパーティの依存関係を含めるためにいくつかの可能な解決策があります。

ソリューション1

我々は変更する必要がjlink私たちの実行時設定で、既存の依存関係を含めて、タスクを。

logj4ジャーがローカル.gradleリポジトリ内、のGradleによって記憶されている場合、ほとんど即時溶液が発見されています。

'--module-path', "libs${File.pathSeparatorChar}${fx_jmods}: \
   /Users/<user>/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.11.1/268..a10/log4j-api-2.11.1.jar: \
   /Users/<user>/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.11.1/59..e4/log4j-core-2.11.1.jar"

このソリューションは動作しますが、それは、ユーザからのローカルパスに依存するため、それは、もちろん、最も便利ではありません。

解決策2

よりよい解決策は、に、のGradleによって直接解決される実行時の依存関係を、コピーするタスクを追加して行うことができるlibsフォルダのように:

task libs(type: Copy) {
    into 'build/libs/'
    from configurations.runtime
}

その後、からこのタスクを呼び出したjlinkタスク:

task jlink(type: Exec) {
    dependsOn 'clean'
    dependsOn 'jar'
    dependsOn 'libs'
    ...
}

あなたが実行している場合は./gradlew jlink、チェックlibsフォルダをあなたはこのような何かを見つける必要があります。

build/libs/hellofx.jar
build/libs/javafx-base-11.0.1.jar
build/libs/javafx-base-11.0.1-$platform.jar
build/libs/javafx-graphics-11.0.1.jar
build/libs/javafx-graphics-11.0.1-$platform.jar
build/libs/javafx-controls-11.0.1.jar
build/libs/javafx-controls-11.0.1-$platform.jar
build/libs/javafx-fxml-11.0.1.jar
build/libs/javafx-fxml-11.0.1-$platform.jar
build/libs/log4j-api-2.11.1.jar
build/libs/log4j-core-2.11.1.jar

どこ$platform実行中のプラットフォームがあります。

ことに注意してくださいlibsフォルダが現在含まれているすべてのモジュールのパスに必要な依存関係を、また、JavaFXのそれは- * - $プラットフォームの瓶が含まので、jmodsがモジュール-pathオプションではもはや必要ではないネイティブライブラリを、。これは十分でしょう。

'--module-path', "libs"

ので、あなたのコマンドラインは次のようになります。

commandLine "${java_home}/bin/jlink", '--module-path', "libs",
        '--add-modules', "${moduleName}", '--output', "${moduleName}", '--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages'

あなたは実行することができますjlink今すぐタスクを正常に。

解決策3

@madheadコメントで示唆したように、あなたがのために別のプラグインを使用することができますjlink:タスクいわゆる ワル-JLINK-プラグイン

以下のようなものにビルドを変更します。

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.5'
    id 'org.beryx.jlink' version '2.1.8'
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
}

javafx {
    modules = ['javafx.controls', 'javafx.fxml']
}

mainClassName = "${moduleName}/eu.sample.app.Main"

jlink {
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = 'helloFX'
    }
}

プラグインは他のプラットフォーム(参照用の画像を作成するためのオプションを持っていることにも注意してくださいtargetPlatformを)。

log4jの程度EDIT

コメントで述べたように、log4j依存関係がまだモジュールとうまく再生されません。ある未解決の問題 Apacheの課題トラッカーでは:

現在、あなたが使用したいランタイムイメージを生成するためにJLINKプロジェクトでのlog4j-コアを使用することはできません与えられた自動モジュールに基づきます。

私は私のメインクラスにこれを追加しました:

LogManager.getLogger(MainApp.class).info("hellofx!");

そして私が追加したlog4j2.xmlにファイルをsrc/main/resources

ランニング./gradlew run、作品:

> Task :run
18:24:26.362 [JavaFX Application Thread] INFO  eu.sample.app.Main - hellofx!

しかし、解決策2からJLINK実行し、カスタムイメージを作成し、私はxmlファイルが含まれていることを確認することができますが、画像から実行しているとき、私は得ます:

build/hellofx/bin/java -m hellofx/eu.sample.app.Main
ERROR StatusLogger Log4j2 could not find a logging implementation. \
    Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

前述のように、ソリューション3からプラグインをJLINKを実行することはで失敗しcreateMergedModuleたタスク

 error: package org.apache.logging.log4j.spi is not visible
   provides org.apache.logging.log4j.spi.Provider with org.apache.logging.log4j.core.impl.Log4jProvider;

[参照EDIT(2)、これはバージョン2.1.9以降に修正されています]

選択肢

この時点で、可能な選択肢ではなく、SLF4Jを使用することができます。あるサンプルに成功し、それを使用して、プラグインのドキュメントから記載されているが。

要約すると、これは必要とされています。

Gradleのファイル:

dependencies {
    compile 'org.slf4j:slf4j-api:1.8.0-beta2'
    compile('ch.qos.logback:logback-classic:1.3.0-alpha4') {
        exclude module: "activation"
    }
}

モジュール情報:

requires org.slf4j;
requires ch.qos.logback.classic;
requires java.naming;

メインクラス:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger logger = LoggerFactory.getLogger(MainApp.class);

...
logger.info("hellofx!");

logging.propertiesここlogback.xmlから、ここでは、あなたのメインクラスと。

両方が動作して./gradlew実行するか./gradlew jlink、とbuild/image/bin/HelloFX仕事、そしてメッセージがコンソールに記録されます。

EDIT(2)

の報告ワル-JLINK-プラグインの問題追跡に問題は、これが解決された、バージョン2.1.19以降では、カスタムイメージを作成する罰金を動作するはずです。

以来log4j、マルチリリースジャーで、一つのこと必要があります:

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.5'
    id 'org.beryx.jlink' version '2.1.9'
}

...

jlink {
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
       name = 'helloFX'
    }
    forceMerge('log4j-api')     // <---- this is required for Log4j
}

完全に動作するサンプルを参照してくださいここに

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=178987&siteId=1