[JAVA] Même si le chemin du fichier de propriétés est spécifié dans l'option -cp, il n'est pas reconnu comme chemin de classe.

environnement

Cet article a été vérifié pour fonctionner dans l'environnement suivant.

C:\>java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)

un événement

Le fichier Main.java suivant lit le queen.properties qui existe sur le chemin de classe, puis formate et affiche le contenu.

Main.java


import java.io.IOException;
import java.util.Properties;

public class Main {
    public static void main(String[] args) {
        try (var in = Main.class.getClassLoader().getResourceAsStream("queen.properties")) {
            var properties = new Properties();
            properties.load(in);

            for (var key : properties.stringPropertyNames()) {
                var value = properties.getProperty(key);
                var message = String.format("key=`%s` value=`%s`", key, value);
                System.out.println(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Le contenu de «queen.properties» est le suivant.

queen.properties


queen.vocal  = Freddie Mercury
queen.guitar = Brian May
queen.bass   = John Deacon
queen.drum   = Roger Taylor

Eh bien, j'ai compilé Main.java avec javac, généré Main.class et l'ai exécuté comme suit, mais une erreur s'est produite et il ne s'est pas comporté comme prévu.

C:\>java -cp properties\queen.properties; Main
Exception in thread "main" java.lang.NullPointerException: inStream parameter is null
        at java.base/java.util.Objects.requireNonNull(Objects.java:246)
        at java.base/java.util.Properties.load(Properties.java:403)
        at Main.main(Main.java:8)

__ Dans ce cas, l'intention était d'ajouter le queen.properties stocké dans le répertoire properties au chemin de classe. Par conséquent, j'ai spécifié properties \ queen.properties dans l'option -cp qui spécifie le chemin de classe, mais il semble que cela ne fonctionne pas bien. __

Causes et contre-mesures

Sauf lors de l'utilisation de jokers (*), il semble que la méthode de spécification du chemin de classe soit à peu près la suivante.

--Spécifiez le nom de fichier pour le fichier jar et le fichier zip. --Autre que cela, spécifiez le nom du répertoire.

Cette demande était de spécifier le fichier de propriétés comme chemin de classe. Par conséquent, cette dernière est la bonne réponse pour spécifier le chemin de classe. Ainsi, lorsque j'ai spécifié le nom du répertoire au lieu du nom du fichier dans l'option -cp, le comportement était comme prévu.

C:\>java -cp properties; Main
key=`queen.guitar` value=`Brian May`
key=`queen.drum` value=`Roger Taylor`
key=`queen.vocal` value=`Freddie Mercury`
key=`queen.bass` value=`John Deacon`

référence

"Définir le chemin d'accès aux classes"

Recommended Posts

Même si le chemin du fichier de propriétés est spécifié dans l'option -cp, il n'est pas reconnu comme chemin de classe.
Mémo: [Java] Si un fichier se trouve dans le répertoire surveillé, traitez-le.
Un hachage actif qui peut être traité comme des données même s'il n'est pas dans la base de données
Continuation ・ Hash actif qui peut être traité comme des données même s'il n'est pas dans la base de données ~ Affichage
Ajouter classpath: au chemin spécifié dans spring.datasource.schema
[Discussion] Pourquoi System.out (in, err) est-il initialisé avec null même s'il s'agit d'une constante?
Le chemin du fichier n'est pas reconnu lors de l'exécution d'une commande externe à partir d'une application Java
Java11: exécuter le code Java dans un seul fichier tel quel
Même si j'écris le paramètre de STRICT_QUOTE_ESCAPING dans CATALINA_OPTS dans tomcat8.5, il n'est pas reflété.
Lisez le fichier sous le chemin de classe sous forme de chaîne de caractères avec ressort
Le phénomène selon lequel vous ne pouvez pas vous déconnecter même s'il est décrit dans la conception