[CENTOS] En vérifiant le fonctionnement de Java sous Linux, j'ai pu comprendre la compilation et la hiérarchie.

L'autre jour, j'ai appris la compilation Java et la gestion des paquets lors d'une session d'étude en interne. Étant donné que je ne pouvais modifier que l'environnement créé avec eclipse, la définition des options de compilation et la création de packages m'ont donné l'occasion de mieux comprendre le comportement de la compilation et comment gérer les packages. Je vais le publier ici comme un examen de moi-même.

environnement

・ CentOS7.4 -Java 1.8.0_171 ・ Vi 7.4 ・ Arbre 1.6.0

Préparation

Créez un répertoire pour vérifier l'opération.

# cd
# mkdir -p JAVA/src
# cd JAVA
# mkdir class

Compiler et exécuter

Si vous regardez la hiérarchie des répertoires à partir du répertoire courant avec la commande tree, ce sera comme suit.

# tree --charset=c
.
|-- class
`-- src

Commencez par passer à src et créez un fichier source de test.

# cd src
# vi TestJava.java

TestJava.java



class TestJava {

    public static void main(String[] args){

        System.out.println("test");

    }

}

Après avoir créé avec le contenu ci-dessus, si vous vérifiez la hiérarchie des répertoires, ce sera comme suit.

# tree ../ --charset=c
../
|-- class
`-- src
    `-- TestJava.java

Compilez le fichier créé. Ici, si vous compilez sans spécifier d'options, un fichier de classe sera créé sous src, mais il est difficile de déplacer le fichier de classe vers un autre répertoire après sa création. Même dans eclipse, cette zone était faite automatiquement, donc je ne l'ai pas sentie, mais si vous le faites manuellement, spécifiez l'option pour qu'elle soit créée dans le répertoire spécifié (répertoire de classe) au moment de la création. Utilisez l'option "-d" pour spécifier le répertoire.

# javac -d ../class TestJava.java

Après exécution, vérifiez l'état de la hiérarchie des répertoires.

# tree ../ --charset=c
../
|-- class
|   `-- TestJava.class
`-- src
    `-- TestJava.java

Un fichier a été créé dans le répertoire de classe spécifié. De cette manière, le fichier source et le fichier de classe sont gérés séparément afin que personne ne puisse modifier la source sans autorisation.

Pour l'exécuter depuis l'extérieur du répertoire de classe au moment de l'exécution, spécifiez le chemin du fichier avec l'option "-cp" pour l'exécuter même s'il n'y a pas de fichiers dans le répertoire en cours. Il s'agit de la méthode lorsque CLASSPATH défini par la variable d'environnement est exécuté sur la ligne de commande.

# java -cp ../class TestJava
test

Il a été exécuté et "test" a été produit.

paquet

Si le nombre de fichiers de classe augmente, gérez les packages séparément pour faciliter la gestion. En outre, il est bon d'éviter les conflits de noms même si vous créez un fichier avec le même nom lors du développement avec plusieurs personnes. Tout d'abord, créez un répertoire pour le package dans le répertoire src, supprimez une fois le fichier de classe et vérifiez.

# mkdir pack1
# mv TestJava.java pack1
# rm -rf ../class/TestJava.class
# cd pack1
# tree ../../ --charset=c
../../
|-- class
`-- src
    `-- pack1
        `-- TestJava.java

Uniquement dans le répertoire src, un fichier est créé dans le répertoire du package.

Lorsque vous utilisez le package, ajoutez la description suivante au début de la source.

package Nom du package

Un exemple de description est le suivant.

TestJava.java


package pack1;

class TestJava {

    public static void main(String[] args){

        System.out.println("test");

    }

}

Décrivez le nom du package créé au début du fichier source comme ceci. Cette fois, nous ne testerons qu'avec un nom de package simple, mais en réalité, nous allons créer un répertoire en creusant une hiérarchie comme jp / co / testcomp / cv```. Ensuite, lors de sa description dans la source, le délimiteur de hiérarchie est représenté par "." Comme package jp.co.testcomp.cv; `. Comme dans l'exemple, il est recommandé que le nom du package commence par l'inverse du nom de domaine Internet. En effet, il est recommandé de nommer le package à partir du nom de domaine qui diffère selon le pays ou la société afin que le nom du package ne soit pas en conflit lors de l'utilisation de programmes d'autres sociétés ou d'autres pays.

Essayons encore.

# javac -d ../class pack1/TestJava.java
# tree ../ --charset=c
../
|-- class
|   `-- pack1
|       `-- TestJava.class
`-- src
    `-- pack1
        `-- TestJava.java

Un fichier a été créé pour chaque répertoire pack1 dans le répertoire de classe. S'il n'y a pas de description de package dans le fichier source, seul le fichier de classe sera créé sans le dossier pack1 dans le répertoire de classe.

Il est bon de faire correspondre la hiérarchie des fichiers source et de classe afin de ne pas créer de confusion dans la destination de stockage. N'oubliez donc pas la description du colis. (Bien que l'éclipse puisse détecter des erreurs)

À propos, l'exécution est spécifiée comme suit.

# java -cp ../class pack1.TestJava
test

Dans le chemin de la classe, spécifiez le répertoire de la classe, mais à partir du package, spécifiez-le comme `` pack1.TestJava```. Il ne peut pas être exécuté par la méthode spécifiée comme l'exemple d'échec.

Exemple d'échec)

# java -cp ../class/pack1 TestJava
# java -cp  ../class TestJava
# java  ../class/pack1/TestJava

Compilez et exécutez plusieurs classes

Tout d'abord, j'ai modifié le fichier comme suit.

TestJava.java


package pack1;

class TestJava {
    int i;
    char c;

    TestJava(){
        i = 1;
        c = 'A';
    }

    TestJava( int p_i, char p_c){
        i = p_i;
        c = p_c;
    }

    void go() {
        System.out.println("GO!");
        System.out.println("i =" + i + "\n" + "c = " + c );
    }

    public static void main(String[] args){

        System.out.println("test2");
        TestJava tj = new TestJava();
        TestJava tj_2 = new TestJava( 2, 'B');
        tj.go();
        tj_2.go();
    }

}

Créez votre propre instance et sortez celle préparée avec 2 modèles dans le constructeur. C'est aussi un programme de test qui produit même sa propre méthode.

J'ai créé un autre fichier.

TestJava2.java


package pack1;

class TestJava2 {

    public static void main(String[] args){
        System.out.println("TestJava2");
        TestJava tj2 = new TestJava();
        TestJava tj2_2 = new TestJava2( 2, 'B');
        tj2.go();
        tj2_2.go();
    }

}

Il s'agit du contenu pour créer une instance à partir de la classe TestJava et l'exécuter.

Supprimez le fichier de classe qui a été créé une fois et créez-le comme suit.

# tree ../../ --charset=c
../../
|-- class
|   `-- pack1
`-- src
    `-- pack1
        |-- TestJava.java
        `-- TestJava2.java

Il existe les méthodes suivantes pour compiler ces deux fichiers.

    1. Compilez plusieurs fichiers en même temps.

javac -d ../../class TestJava.java TestJava2.java



 2. Compilez le fichier appelant puis compilez le fichier appelant
 Dans ce cas, TestJava2.java utilise TestJava.java, vous devez donc également spécifier le chemin de classe.

javac -d ../../class TestJava.java

javac -d ../../class -cp ../../class TestJava2.java


 Cliquez ici pour le résultat de l'exécution.

java -cp ../../class pack1.TestJava2

TestJava2 GO! i =1 c = A GO! i =2 c = B



 c'est tout.


Recommended Posts

En vérifiant le fonctionnement de Java sous Linux, j'ai pu comprendre la compilation et la hiérarchie.
Je n'ai pas vraiment compris le comportement de Java Scanner et .nextLine ()
J'ai essayé de résumer les bases de kotlin et java
Recommandation de l'opération set par Java (et compréhension de equals et hashCode)
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
J'ai comparé les caractéristiques de Java et .NET
J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji
Le fichier CSV que j'ai pu télécharger a soudainement commencé à apparaître sur la page.
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
J'étais accro au record du modèle associé
Classes et instances Java comprises dans la figure
J'ai résumé les types et les bases des exceptions Java
20190803_Java & k8s sur Azure L'histoire d'aller au festival
Commande pour vérifier le nombre et l'état des threads Java
J'étais accro à la mise à jour de la déclaration dans MyBatis
Comprendre le modèle Singleton en comparant le code Java et JavaScript
J'étais accro au réglage de laradock + VSCode + xdebug
Comprendre le modèle Iterator en comparant le code Java et JavaScript
Réintroduction à Java for Humanities 0: Comprendre l'acte de programmation
[Java] J'ai réfléchi aux mérites et aux utilisations de "interface"
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
[Scala] [Java] J'ai essayé de corriger la vulnérabilité de traversée de répertoire lors de la décompression de Zip4j par opération de code d'octet.
[Java] Divers résumés joints aux chefs de classe et aux membres
Je veux comprendre le flux des paramètres de demande de traitement Spring
Je veux revenir à l'écran précédent avec kotlin et java!
J'ai essayé d'approfondir ma compréhension de l'orientation des objets de n%
Je veux limiter l'entrée en réduisant la plage de nombres
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
J'étais accro au paramètre API version min23 de registerTorchCallback
J'ai pu déployer l'application Docker + laravel + MySQL sur Heroku!
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
[java8] Pour comprendre l'API Stream
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Je veux afficher des images avec REST Controller de Java et Spring!
J'étais accro à un simple test de Jedis (bibliothèque Java-> Redis)
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Je veux passer l'argument d'Annotation et l'argument de la méthode d'appel à aspect
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
[Cas d'amélioration Java] Comment atteindre la limite de l'auto-apprentissage et au-delà
Vérifiez l'enregistrement MX de l'adresse e-mail avec java et vérifiez le domaine
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
[Rails] La cause de l'impossibilité de publier des messages était form_with
[Rails] Articles pour les débutants pour organiser et comprendre le flux de form_with
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH