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
ne peut pas être obtenu et devient null
--Gradle et IntelliJ affichent les résultats de construction de src / main / java
et src / main / resources
dans différents répertoires.
résultat de la construction gradle
|-build
: |-classes/java/main/
: | `-foo/
: | `-Foo.class
: |
: |-resources/main/
: : `-resource.txt
Résultats de la construction IntelliJ
|-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);
}
}
Résultat de l'exécution Gradle
[jdk.module.path]
...\build\classes\java\main
...\build\resources\main
resource=null
Résultat d'exécution d'IntelliJ
[jdk.module.path]
...\out\production\classes
...\out\production\resources
resource=null
--Chacun est défini dans le chemin du module
resources
est traité comme un module séparé du module foo
.module-info.class
dans le chemin du module, sera-t-il traité comme un module anonyme? ?? ??Class.getResource (String)
, il explique comme suit:Si cette classe est dans un module nommé, ** cette méthode essaiera de trouver des ressources dans le module **. (Omis) Cette méthode renvoie null ** si la ressource est une ressource non ".class" dans un package qui n'est ** pas ouvert au module appelant **.
getResource(String) | Class | Java 10
Class.getResource (String)
essaie de trouver uniquement les ressources dans le module auquel appartient la classe.
--Si la ressource est un autre module, le package doit être ouvert (spécifié ʻopens`?)resources
est traité comme un module anonyme, j'estime que le module anonyme n'est pas accessible à partir du module nommé.src / main / java
et src / main / resources
sont affichés sous bin / main
.--Pour Gradle et IntelliJ, les fichiers sous le répertoire src / main / resources
sont sortis dans un répertoire différent du résultat de la compilation sous src / main / java
.
src / main / java
et src / main / resources
seront spécifiées dans le chemin du module en tant que répertoires séparés.
--src / main / resources
est traité comme un module différent de src / main / java
(probablement un module anonyme?)
--Class.getResource (String)
semble essentiellement ne pouvoir accéder aux ressources que dans le même module ou dans un module ouvertsrc / main / resources
ne peuvent pas être lus comme des ressources.Attendu jusqu'au dernier.
Can't access resource with Java 10 – IDEs Support (IntelliJ Platform) | JetBrains
Il semble que certaines personnes aient des problèmes avec la même chose.
La dernière méthode expliquée ici est que la destination de sortie de src / main / resources
doit être la même que la destination de sortie de src / main / java
.
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()
}
}
--Ajustement de la destination de sortie d'IntelliJ et de la destination de sortie de Gradle respectivement
Résultat de l'exécution Gradle
> gradle run
[jdk.module.path]
...\build\classes\java\main
resource=file:/.../build/classes/java/main/resource.txt
Résultat d'exécution d'IntelliJ
[jdk.module.path]
...\out\production\classes
resource=file:/.../out/production/classes/resource.txt
src / main / resources
.Recommended Posts