Fehler in module-info.java
Auch wenn die Konformitätsstufe des Projekts Java9 gesetzt wurde, könnte es irreführend Fehler für module-info.java gezeigt werden in Eclipse.
Ich erwartete, dass eine Aktualisierung des Maven-Projekts nur erforderlich wäre, wenn ich die Datei pom.xml ändere. Jetzt habe ich gelernt, dass das Ändern der Modulinfo.java auch eine manuelle Aktualisierung des Maven-Projekts erfordert.
=>Update des Maven-Projekt (Alt + F5)
Nach diesem Update meiner Fehler verschwunden.
Ich habe auch gelernt, dass es besser ist, zuerst die Versionen in der Datei pom.xml zu aktualisieren und dann die Modulinfo.java zu generieren. Andernfalls enthält das Modul-info.java nicht vorhandene Module wie "erfordert log4j" anstelle von "erfordert log4j.api"
Ein weiterer irreführender Fehler in modul-info.java kann aufgrund der Pom-Verpackung auftreten, siehe unten.
Ungelöste Importe
Für den Fall, dass ein Import kann nicht die Frage gelöst werden könnte „die entsprechende (neu) Modul benötige ich für die (alten) importiert werden?“. Was könnte hier helfen:
Suche auf der folgenden Seite für die gewünschte Seite: http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html (listet alle exportierten Pakete der JDK-Module)
Verwenden JDeps auf der (alten) * .jar Datei, um eine Liste der benötigten JAR-Dateien zu erhalten, z
jdeps --Klasse-Pfad "lib" MY-OLD.jar> output.txt
Verwenden jar das Modul für eine JAR-Datei
jar --describe-Modul zu finden -recursive - -FILE ERFORDERLICH-JAR-Datei.jar
siehe auch:
Re-Export Abhängigkeiten
Um automatisch log4j sichtbar für Großeltern-Projekt zu machen
grandparent => parent => log4j
Sie könnten
verwenden möchten
in Mutter statt
requires log4j.api
in Großeltern. siehe auch:
What's the difference between requires and requires transitive statements in Java 9 module declaration
POM Verpackung
Mein Hauptproblem scheint zu sein, dass meine Java8 pom.xml Datei pom Verpackung:
<packaging>pom</packaging>
Wenn ich diese Zeile entfernen, In Modul-info.java werden keine Fehler angezeigt
Siehe auch diese zusätzliche Frage: How to use maven with Java9.0.1 and pom packaging in Eclipse Oxygen 1a Release (4.7.1a)?
New log4j Version
A. Neben der Änderung "erfordert log4j" => „log4j erfordert.api“Ich hatte die Berufung Code für die neue log4j Version anzupassen, zu Java9 kompatibel:
private static Logger syslog = Logger.getLogger (Main.class);
zu
private static Logger syslog = LogManager.getLogger (Main.class);
B. log4j 2 nicht PropertyConfigurator haben auch diese Frage im Zusammenhang sehen:
PropertyConfigurator in log4j2
. 210
C. log4j 2 unterstützt keine log4j.properties-Dateien. Früher verwendete ich
src/main/resources/META-INF/log4j.properties
für die Konfiguration. Jetzt benutze ich
src/main/resources/log4j2.xml
Auch
Arbeitsbeispiel als Referenz sehen
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Log4JWithJava9</groupId>
<artifactId>Log4JWithJava9</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
</dependencies>
</project>
module-info.java:
module Log4JWithJava9 {
requires javafx.base;
requires log4j.api;
}
Main.java:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Main {
private static Logger sysLog = LogManager.getLogger(Main.class);
public static void main(String[] args) {
}
}
Eclipse-Plugins
Um log4j zu einer Eclipse-Plugin hinzufügen, kopierte ich die Datei log4j-api-2.10.0.jar in einem Ordner "lib" und hinzugefügt, um die JAR-Datei Java Build Path => Bibliotheken => ModulePath
Statt requires log4j.api
hatte ich requires org.apache.logging.log4j
Sie nicht den Compiler ein weiteres Mal auf den Zyklus Leben Plugin binden sollte verwenden. Definieren Sie das maven-compiler-plugin nur in pluginManagement Version 3.7.0 und definieren Sie source/target ... no bindings .. Das log4j-api enthält keine modules-info.class Datei, daher wird nur der Automodulname log4j- verwendet. api? und nicht log4j ... – khmarbaise
Wenn keiner der "erfordert" erkannt wird, würde ich darauf bestehen, dass Sie die komplette Projektstruktur gefolgt und '' Config Ihrer pom.xml teilen. Auch der automatische Modulname, der für die obigen Abhängigkeiten abgeleitet wird, ist "log4j.api" bzw. "log4j.core". –
nullpointer
Sie können den 'jar' Befehl (aus Java 9) verwenden, um den Namen eines Moduls zu ermitteln:' jar --describe-modul - Datei $ JAR-FILE' sagt Ihnen, unter welchem Namen Sie es benötigen. Darüber hinaus können Sie [JDeps verwenden, um zu ermitteln, auf welche JARs Sie direkt angewiesen sind] (https://blog.codefx.org/tools/jdeps-tutorial-analyze-java-project-dependencies/#Getting-To-Know-JDeps). . – Nicolai