[JAVA] Bei Verwendung von Modulen mit Gradle und IntelliJ können keine Ressourcen abgerufen werden

Umgebung

Java

openjdk 11 2018-09-25

Gradle

Gradle 4.10.2

IntelliJ

IntelliJ IDEA 2018.2.4 (Community Edition)
Build #IC-182.4505.22, built on September 18, 2018

OS

Windows 10

Probleme, die auftreten

Projektstruktur

|-build.gradle
`-src/main/
  |-java/
  | |-module-info.java
  | `-foo/
  |   `-Foo.java
  `-resources/
    `-resource.txt

Code

build.gradle


apply plugin: "application"

sourceCompatibility = 11
targetCompatibility = 11

compileJava.options.encoding = "UTF-8"
mainClassName = "foo/foo.Foo"

compileJava {
    doFirst {
        options.compilerArgs = [
            "--module-path", classpath.asPath
        ]
        classpath = files()
    }
}

run {
    doFirst {
        jvmArgs = [
            "--module-path", classpath.asPath,
            "--module", mainClassName
        ]
        classpath = files()
    }
}

module-info.java


module foo {
    exports foo;
}

Foo.java


package foo;

import java.net.URL;

public class Foo {

    public static void main(String[] args) throws Exception {
        URL resource = Foo.class.getResource("/resource.txt");
        System.out.println("resource=" + resource);
    }
}

Ausführungsergebnis

> gradle run
resource=null

-- / resource.txt kann nicht abgerufen werden und wird zu null

Ursache (wahrscheinlich)

--Gradle und IntelliJ geben die Build-Ergebnisse von "src / main / java" und "src / main / resources" in verschiedene Verzeichnisse aus.

Gradle Build Ergebnis


|-build
: |-classes/java/main/
: | `-foo/
: |   `-Foo.class
: |
: |-resources/main/
: : `-resource.txt

IntelliJ Build-Ergebnisse


|-out/production/
: |-classes/
: | `-foo/
: |   `-Foo.class
: |
: `-resources/
:   `-resource.txt

Foo.java


package foo;

import java.net.URL;
import java.util.stream.Stream;

public class Foo {

    public static void main(String[] args) throws Exception {
        System.out.println("[jdk.module.path]");
        Stream.of(System.getProperty("jdk.module.path")
                .split(";"))
                .map(p -> "  " + p)
                .forEach(System.out::println);

        URL resource = Foo.class.getResource("/resource.txt");
        System.out.println("resource=" + resource);
    }
}

Ergebnis der Gradle-Ausführung


[jdk.module.path]
  ...\build\classes\java\main
  ...\build\resources\main
resource=null

Ausführungsergebnis von IntelliJ


[jdk.module.path]
  ...\out\production\classes
  ...\out\production\resources
resource=null

--Jeder ist im Modulpfad eingestellt

Wenn sich diese Klasse in einem benannten Modul befindet, ** versucht diese Methode, Ressourcen im Modul zu finden **. (Weggelassen) Diese Methode gibt null ** zurück, wenn die Ressource eine Ressource ".class" in einem Paket ist, das ** für das aufrufende Modul ** nicht geöffnet ist **.

getResource(String) | Class | Java 10

Organisieren Sie die Geschichte

Bis zuletzt erwartet.

Lösungen

Can't access resource with Java 10 – IDEs Support (IntelliJ Platform) | JetBrains

Es scheint, dass einige Leute mit der gleichen Sache in Schwierigkeiten sind.

Die letzte hier erläuterte Methode ist, dass das Ausgabeziel von "src / main / resources" mit dem Ausgabeziel von "src / main / java" identisch sein sollte.

build.gradle


apply plugin: "application"
+ apply plugin: 'idea'

sourceCompatibility = 11
targetCompatibility = 11

compileJava.options.encoding = "UTF-8"
mainClassName = "foo/foo.Foo"

+ sourceSets {
+     main {
+         output.resourcesDir = java.outputDir
+     }
+ }
+ 
+ idea.module.outputDir file("out/production/classes")

compileJava {
    doFirst {
        options.compilerArgs = [
            "--module-path", classpath.asPath
        ]
        classpath = files()
    }
}

run {
    doFirst {
        jvmArgs = [
            "--module-path", classpath.asPath,
            "--module", mainClassName
        ]
        classpath = files()
    }
}

Ausführungsergebnis

Ergebnis der Gradle-Ausführung


> gradle run
[jdk.module.path]
  ...\build\classes\java\main
resource=file:/.../build/classes/java/main/resource.txt

Ausführungsergebnis von IntelliJ


[jdk.module.path]
  ...\out\production\classes
resource=file:/.../out/production/classes/resource.txt

Recommended Posts

Bei Verwendung von Modulen mit Gradle und IntelliJ können keine Ressourcen abgerufen werden
Ich habe die Punkte zusammengefasst, die bei der kombinierten Verwendung von Ressourcen und Ressourcen zu beachten sind
Lösen Sie "Symbol kann nicht aufgelöst werden" in IntelliJ-Projekten mit Gradle auf
Dinge, die Sie bei der Verwendung der if-Anweisung beachten sollten
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Testen des Einschlusses von Bildern bei Verwendung von ActiveStorage und Faker
Abrufen von Fehlerinformationen mithilfe von DefaultErrorAttributes und ErrorAttributeOptions in Spring Boot 2.3
Richten Sie in IntelliJ ein Gradle-Multiprojekt ein, um eine JAR-Datei zu erstellen
Dynamisches Wechseln von JDKs beim Erstellen von Java mit Gradle
Hat zu Gradle beigetragen und wurde im Release Note genannt
Gradle zum Anfassen und Erinnern
In Java 10, wenn Gradle Eclipse abgeschlossen ist und JavaSE-1.10 herauskommt, ...
Wie POST JSON in Java-Methode mit OkHttp3 und Methode mit HttpUrlConnection-
So erstellen Sie ein neues Gradle + Java + Jar-Projekt in Intellij 2016.03
Vorsichtsmaßnahmen bei der Verwendung von Spring AOP mit Jersery-Ressourcenklassen
[jOOQ] Wie in der WHERE / AND / OR-Klausel WANN FALLEN
Abrufen und Hinzufügen von Daten aus dem Firebase Firestore in Ruby
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
Einige nützliche Dinge, die ich seit der Migration von Eclipse zu IntelliJ IDEA verwendet habe (in Bezug auf Suche und Git)
Beliebte Trends bei Gradle und Maven
Mach HelloWorld mit Java / IntelliJ / Gradle
Wie man Ant in Gradle ausführt
So erhalten Sie Parameter in Spark
Hallo Welt in Java und Gradle
Aktivieren Sie die Protokollausgabe sowohl für Dateien als auch für die Konsole mit log4j in Eclipse.
Dinge, die beim Kombinieren von if-Anweisungen und logischen Operatoren zu beachten sind
[Android] Übergeben von Bildern und Empfangen von Rückrufen beim Teilen mit ShareCompat
[Hinweis] Ich möchte mit afterLast mit JdbcTemplate in umgekehrter Reihenfolge arbeiten
Versuchen Sie, mit MyBatis im Micronaut + Kotlin-Projekt Daten aus der Datenbank abzurufen
Beachten Sie Folgendes, wenn Sie Apache PDFBox® mit AWS Lambda verwenden
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Java - Führen Sie das CheckStyle-Plug-In in IntelliJ IDEA ein und spiegeln Sie es im Formatierer wider
So erstellen Sie Ihre eigene Anmerkung in Java und erhalten den Wert
Was tun, wenn die Befehlszeile zu lang ist? Wird beim Erstellen eines Gradle-Projekts in Intellij IDEA angezeigt