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
|-build.gradle
`-src/main/
  |-java/
  | |-module-info.java
  | `-foo/
  |   `-Foo.java
  `-resources/
    `-resource.txt
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);
    }
}
> gradle run
resource=null
-- / resource.txt kann nicht abgerufen werden und wird zu null
--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
Class.getResource (String) versucht nur die Ressourcen in dem Modul zu finden, zu dem die Klasse gehört.
--Wenn die Ressource ein anderes Modul ist, muss das Paket geöffnet sein (opens angegeben?)src / main / resources wird als ein anderes Modul behandelt als src / main / java (wahrscheinlich ein anonymes Modul?)
--Class.getResource (String) scheint grundsätzlich nur auf Ressourcen im selben Modul oder in einem offenen Modul zugreifen zu könnenBis zuletzt erwartet.
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()
    }
}
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