Вход в модульное приложение Java 9 не работает - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть проект Maven с Java 9, и я использую модули.Logback, кажется, поддерживает это начиная с версии 1.3.0-alpha1, но, к сожалению, я не смог заставить его работать.

Я получаю следующее сообщение от SLF4J:

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

Похоже, это такне могу найти Logback.И осматривая (сгенерированным Jlink) артефакт с использованием jimage list .../modules, я не могу найти ничего о logback, кроме моего файла конфигурации logback.xml.

Возможно, проблема заключается в моем модуле-info.java:

open module my.super.app {
    requires jackson.annotations;
    requires jdk.jsobject;
    requires com.fasterxml.jackson.databind;
    requires com.fasterxml.jackson.core;
    requires javafx.graphics;
    requires javafx.controls;
    requires org.slf4j;

    exports my.super.app;
}

Как и где я могу объявить зависимость от Logback с использованием модулей Java 9?

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Краткий ответ: Вы объявляете это в своем вызове jlink, добавляя logback к пути к модулю и используя опцию - bind-services .В вашем модуле вы определяете только использование SLF4j.

Длинный ответ:

Я сделал это в простом примере со следующими частями.

Начиная с версии 1.8.0 SLF4J имеет модульную структуру и использует механизм ServiceLoader для поиска своего бэкэнда ведения журнала.

Классический возврат: 1.3.0-alpha4 также является модульным и объявляет службу как в META-INF / services / org.slf4j.spi.SLF4JServiceProvider , так и в своем дескрипторе модуля:

provides org.slf4j.spi.SLF4JServiceProvider with ch.qos.logback.classic.spi.LogbackServiceProvider;

SLF4J объявляетв своем дескрипторе модуля ему требуется SLF4JServiceProvider:

uses org.slf4j.spi.SLF4JServiceProvider

Поэтому в моем POM (см. ниже) я объявляю только зависимость времени выполнения от Logback, а мой дескриптор модуля содержит только условие «require» для SLF4J.

Мой модуль "com.github.gv2011.j9mod.loguse" содержит основной класс, который записывает оператор в SLF4J-Logger.

Кроме того, он содержит файл конфигурации logback.xml в видересурс.Этот файл доступен для Logback, поскольку он является «разным ресурсом», то есть ресурсом, не входящим в пакет модуля (см. BuiltinClassLoader source).

Logback должен быть явно добавлен во время выполненияизображение через опцию jlink " - bind-services " (потому что это реализация сервиса).

Кроме того, Logback и его зависимости должны быть доступны в модуле pathp (опция jlink " - путь к модулю ").

Дескриптор модуля :

module com.github.gv2011.j9mod.loguse {
  requires org.slf4j;
}

pom.xml :

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.github.gv2011.j9mod</groupId>
  <artifactId>j9mod-log-use</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.8.0-beta4</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.3.0-alpha4</version>
        <scope>runtime</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
    </plugins>
</build>

logback.xml :

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <!-- "+++" just to make it obvious that this file is used: -->
      <pattern>+++ %d{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="com.github.gv2011.j9mod.loguse.Main" level="INFO" />

  <root level="WARN">
    <appender-ref ref="STDOUT" />
  </root>

</configuration>

Main-Class :

package com.github.gv2011.j9mod.loguse;
import static org.slf4j.LoggerFactory.getLogger;
import org.slf4j.Logger;

public class Main {

  private static final Logger LOG = getLogger(Main.class);

  public static void main(final String[] args) {
    LOG.info("Tach.");
  }
}

Вывод (Eclipse - Run As - Java-приложение) :

+++ 2019-05-09T17:43:20,594Z [main] INFO  com.github.gv2011.j9mod.loguse.Main - Tach.

jlink :

%JAVA_HOME%\bin\jlink.exe ^
--output target\image ^
--module-path ^
target\classes;^
%M2_REPO%\org\slf4j\slf4j-api\1.8.0-beta4\slf4j-api-1.8.0-beta4.jar;^
%M2_REPO%\ch\qos\logback\logback-classic\1.3.0-alpha4\logback-classic-1.3.0-alpha4.jar;^
%M2_REPO%\ch\qos\logback\logback-core\1.3.0-alpha4\logback-core-1.3.0-alpha4.jar ^
--bind-services ^
--launcher hello=com.github.gv2011.j9mod.loguse/com.github.gv2011.j9mod.loguse.Main ^
--add-modules com.github.gv2011.j9mod.loguse

Вывод (target / image / bin / hello) :

+++ 2019-05-10T11:45:24,844Z [main] INFO  com.github.gv2011.j9mod.loguse.Main - Tach.

Протестировано с openjdk-11.0.2_windows-x64, apache-maven-3.6.0 и eclipse-jee-2019-03-R-win32-x86_64 в Windows 10, 64-разрядная версия.

0 голосов
/ 23 февраля 2019

Я наконец понял это.В конце я просто добавил Logback в качестве зависимости в моем module-info.java:

open module my.super.app {
    requires jackson.annotations;
    requires jdk.jsobject;
    requires com.fasterxml.jackson.databind;
    requires com.fasterxml.jackson.core;
    requires javafx.graphics;
    requires javafx.controls;
    requires org.slf4j;
    requires ch.qos.logback.classic; //only runtime dependency

    exports my.super.app;
}

Я думаю, что нет способа объявить зависимость во время выполнения (аналогично Maven) - теперь это также необходимово время компиляции.

...