[JAVA] Impossible d'obtenir des ressources lors de l'utilisation de modules avec Gradle et IntelliJ

environnement

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

Problèmes qui surviennent

Structure du projet

|-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);
    }
}

Résultat d'exécution

> gradle run
resource=null

-- / resource.txt ne peut pas être obtenu et devient null

Cause (probablement)

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

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

Organisez l'histoire

--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.

Attendu jusqu'au dernier.

Solution

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 d'exécution

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

Recommended Posts

Impossible d'obtenir des ressources lors de l'utilisation de modules avec Gradle et IntelliJ
J'ai résumé les points à noter lors de l'utilisation combinée des ressources et des ressources
Résoudre «Impossible de résoudre le symbole» dans les projets IntelliJ à l'aide de Gradle
Points à garder à l'esprit lors de l'utilisation de l'instruction if
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment tester avec des images lors de l'utilisation d'ActiveStorage et de Faker
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
Configurer un multi-projet Gradle dans IntelliJ pour créer un fichier JAR
Comment changer dynamiquement les JDK lors de la construction de Java avec Gradle
Contribué à Gradle et a été nommé dans la note de publication
Gradle pour toucher et se souvenir
Dans Java 10, lorsque l'éclipse gradle est terminée et que JavaSE-1.10 sort, ...
Comment POST JSON dans la méthode Java en utilisant OkHttp3 et la méthode en utilisant HttpUrlConnection-
Comment créer un nouveau projet Gradle + Java + Jar dans Intellij 2016.03
Précautions lors de l'utilisation de Spring AOP avec les classes de ressources Jersery
[jOOQ] Comment utiliser CASE WHEN dans la clause WHERE / AND / OR
Comment obtenir et ajouter des données depuis Firebase Firestore dans Ruby
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
Quelques éléments utiles que j'utilise depuis la migration d'Eclipse vers IntelliJ IDEA (en termes de recherche et de Git)
Tendances populaires dans Gradle et Maven
Faites HelloWorld avec Java / IntelliJ / Gradle
Comment exécuter Ant dans Gradle
Comment obtenir des paramètres dans Spark
Bonjour tout le monde en Java et Gradle
Activez la sortie du journal vers les fichiers et la console à l'aide de log4j dans Eclipse.
Points à prendre en compte lors de la combinaison d'instructions if et d'opérateurs logiques
[Android] Comment transmettre des images et recevoir des rappels lors du partage à l'aide de ShareCompat
[Note] Je veux obtenir dans l'ordre inverse en utilisant afterLast avec JdbcTemplate
Essayez d'obtenir des données de la base de données en utilisant MyBatis dans le projet Micronaut + Kotlin
Points à garder à l'esprit lors de l'utilisation d'Apache PDFBox® avec AWS Lambda
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Java --Introduire le plug-in CheckStyle dans IntelliJ IDEA et le refléter dans le formateur
Comment créer votre propre annotation en Java et obtenir la valeur
Que faire si la ligne de commande est trop longue apparaît lors de la création d'un projet Gradle dans Intellij IDEA