2017-11-10 6 views
2

Ich versuche ein Java8-Projekt nach Java9 zu migrieren. Die automatisch generierten module-info.java enthält einen EintragWie log4j mit Maven und Java9 in Eclipse Oxygen zu verwenden?

requires log4j; 

und ein Fehler wird angezeigt:

log4j cannot be resolved to a module 

=> Wie kann ich richtig als Modul Abhängigkeit mit Java9 LOG4J umfassen?

(ich habe das gleiche Problem für folgende Abhängigkeiten: erfordert hibernate.core; erfordert hibernate.jpa.2.1.api; erfordert jcommander; erfordert junit; erfordert Reflexionen; )

Was ich habe bisher:

  • installierte Java 9.0.1
  • Upgraded Eclipse Oxyg en.1a Mitteilung (4.7.1a)
  • Changed Compliance-Niveau meiner Java-Projekt bis 9
  • generiert module-info.java mit Rechtsklick auf Projekt => Configure => Gene module-info.java

  • die Plugins in meiner pom.xml Datei aktualisiert und stellen Sie Java-Version bis 9 (auch https://cwiki.apache.org/confluence/display/MAVEN/Java+9+-+Jigsaw sehen):

    <!-- plugin for compile phase (and test-compile phase) --> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-compiler-plugin</artifactId> 
         <version>3.7.0</version> 
         <configuration> 
          <!-- specify current java version here: --> 
          <source>9</source> 
          <target>9</target> 
         </configuration>     
        </plugin> 
    
  • Aktualisiert log4j Version in pom.xml Datei seit log4j 1.2 nicht mit Java9 zu funktionieren scheint (siehe https://blogs.apache.org/logging/entry/moving_on_to_log4j_2)

    <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> 
    
+1

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

+3

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

+2

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

Antwort

3

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

enter image description here

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

enter image description here

Verwandte Themen