Ce que j'ai recherché sur Java 9

Aperçu

Il semble que Java 10 (est-ce 18.3?) Apparaîtra bientôt, j'ai donc décrit ce que j'ai étudié et essayé avec la fonction ajoutée dans 9.

Ce que j'ai regardé

JShell JShell a été introduit. Vous pouvez exécuter du code de manière interactive à partir de la ligne de commande. Lorsque vous souhaitez exécuter un code simple, vous pouvez éviter de l'exécuter en utilisant un fichier de classe.

helloworld.jpg

List.of、Set.of、Map.of Une méthode de fabrique a été ajoutée à la classe de collection.

List<String> list = List.of("café au lait", "Lait de fraise");
Set<String> set = Set.of("Lait Remon", "Lait de melon");
Map<String, String> map = Map.of("café au lait", "100 yens", "Lait de fraise", "120 yens");

La collection créée par la méthode of est immuable.

Fonction du module

Avec l'introduction de la fonction module, il est devenu possible de clarifier la portée de la divulgation et les dépendances des modules. Les méthodes publiques telles que les bibliothèques étaient référencées dans des classes qui n'étaient pas censées être utilisées ... Vous pouvez également empêcher de telles choses. Référence: Project Jigsaw

Lorsque vous n'utilisez pas la fonction module

Structure de dossier du côté appelé (jar) (1)


gyunyu/
 ┗━ src/
    ┗━ jp/gr/java_conf/masakado/gyunyu/
       ┣━ Coffee.java
       ┗━ util/
          ┗━ Utility.java

Coffee.java


public class Coffee {
	public void print() {
		Utility.output("café");
	}
}

java.Utility.java


public class Utility {
	public static void output(String name) {
		System.out.println("c'est," + name + "C'est du lait.");
	}
}

ʻUtility.output (...) `est censé être utilisé uniquement dans le projet gyunyu. Cette méthode n'est pas censée être exécutée de l'extérieur.

Compilez les deux fichiers ci-dessus pour créer gyunyu.jar.

javac -d bin -encoding UTF-8 src\jp\gr\java_conf\masakado\gyunyu\Coffee.java src\jp\gr\java_conf\masakado\gyunyu\util\Utility.java
jar -cvf gyunyu.jar -C bin .

Structure des dossiers de l'appelant (1)


sample/
 ┣━ src/
 ┃  ┗━ jp/gr/java_conf/masakado/sample/
 ┃     ┗━ Main.java
 ┗━ lib/
    ┗━ gyunyu.jar

Main.java


import jp.gr.java_conf.masakado.gyunyu.Coffee;
import jp.gr.java_conf.masakado.gyunyu.util.Utility;
public class Main {
	public static void main(String[] args) {
		(new Main()).execute();
	}

	public void execute() {
		Coffee coffee = new Coffee();
		coffee.print();
		Utility.output("Appel inattendu: Ichigo"); //Se référer à une méthode qui n'est pas censée être exécutée de l'extérieur
	}
}

Il fait référence à ʻUtility.output (...) de gyunyu.jar`, qui n'est pas censé être exécuté de l'extérieur. Si vous compilez et exécutez ceci

javac -d bin -cp lib\gyunyu.jar -encoding UTF-8  src\jp\gr\java_conf\masakado\sample\Main.java
java -cp lib\gyunyu.jar;bin jp.gr.java_conf.masakado.sample.Main

Il sera affiché comme ci-dessous.

sample01.jpg

Lors de l'utilisation de la fonction module

Créez module-info.java sur le côté appelé (jar).

Structure de dossier du côté appelé (jar) (2)


gyunyu/
 ┗━ src/
    ┣━ jp/gr/java_conf/masakado/gyunyu/
    ┃  ┣━ Coffee.java
    ┃  ┗━ util/
    ┃     ┗━ Utility.java
    ┗━ module-info.java

module-info.java


module jp.gr.java_conf.masakado.gyunyu {
	exports jp.gr.java_conf.masakado.gyunyu;
}

ʻExports`: spécifiez le package à publier vers l'extérieur.

Le nom du module est le même que le nom du package, mais vous n'avez pas à le faire correspondre avec le nom du package et vous pouvez le nommer librement. Compilez-le pour créer un fichier jar.

javac -d bin -encoding UTF-8 src\module-info.java src\jp\gr\java_conf\masakado\gyunyu\Coffee.java src\jp\gr\java_conf\masakado\gyunyu\util\Utility.java
jar -cvf gyunyu.jar -C bin .

Placez le gyunyu.jar créé dans sample / lib et créez module-info.java.

Structure des dossiers de l'appelant (1)


sample/
 ┣━ src/
 ┃  ┣━ jp/gr/java_conf/masakado/sample/
 ┃  ┃  ┗━ Main.java
 ┃  ┗━ module-info.java
 ┗━ lib/
    ┗━ gyunyu.jar

module-info.java


module jp.gr.java_conf.masakado.sample {
	requires jp.gr.java_conf.masakado.gyunyu;
}

requires: Spécifiez le module dépendant (utilisé).

Compilez en spécifiant gyunyu.jar avec l'option -p.

javac -d bin -p lib\gyunyu.jar -encoding UTF-8 src\module-info.java src\jp\gr\java_conf\masakado\sample\Main.java

Le message d'erreur suivant s'affiche et la compilation échoue.

Paquet jp.gr.java_conf.masakado.gyunyu.util ne peut pas être affiché
(Paquet jp.gr.java_conf.masakado.gyunyu.util est un module jp.gr.java_conf.masakado.Déclaré par gyunyu mais non exporté)

Si vous supprimez ʻUtility.output (...) décrit dans Main.java`, la compilation passera.

Afficher les informations du module

Vous pouvez consulter les informations du module en exécutant la commande jar avec l'option -d spécifiée comme indiqué ci-dessous.

jar -d -f lib\gyunyu.jar
exports jp.gr.java_conf.masakado.gyunyu
requires java.base mandated
contains jp.gr.java_conf.masakado.gyunyu.util

ʻExports: paquet publié requiert: modules dépendants contains`: packages qui ne sont pas répertoriés dans les exportations mais qui sont inclus dans le fichier jar

finalement

Comme la dépendance est devenue plus facile à comprendre en introduisant la fonction module, la compilation s'est bien déroulée, donc quand j'ai essayé de l'exécuter, le JAR n'était pas suffisant et une erreur s'est produite ... J'ai senti que la possibilité que quelque chose comme ça se produise diminuerait. Je n'ai pas encore traité des JAR qui prennent en charge les modules, donc il y a peut-être longtemps que je peux bénéficier des fonctions du module.

Recommended Posts

Ce que j'ai recherché sur Java 8
Ce que j'ai recherché sur Java 9
Ce que j'ai recherché sur Java 7
Ce que j'ai recherché sur Java 5
Ce que j'ai recherché sur l'apprentissage Java
Ce que j'ai appris sur Kotlin
Ce que j'ai appris avec Java Gold
Ce que j'ai appris avec Java Silver
À propos de l'interface Java
[Java] À propos des fonctionnalités de Java 12
Qu'est-ce que 'java
[Java] À propos des tableaux
Prenez ce que vous avez appris sur la réflexion Java
Quelque chose à propos de java
Où est Java
À propos des fonctionnalités Java
Qu'est-ce que Java <>?
À propos des threads Java
Interface [Java]
Qu'est-ce que 'java
Ce que j'ai appris
À propos de la classe Java
À propos des tableaux Java
À propos de l'héritage Java
À propos de l'interface, interface java
Ce que j'ai appris du calcul monétaire Java
À propos de Java Var
À propos de Java Literal
À propos des commandes Java
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
Résumé de ce que j'ai appris sur Spring Boot
Ce que j'ai appris en Java (partie 2) Que sont les variables?
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
À propos de la sortie du journal Java
À propos de l'interface fonctionnelle Java
Java, à propos d'un tableau à deux dimensions
À propos de la division de classe (Java)
À propos de [Java] [StreamAPI] allMatch ()
À propos de la classe Java StringBuilder
J'ai d'abord touché Java ②
[Java] À propos de la classe Singleton
J'ai d'abord touché Java ③
À propos de la liaison de méthode Java
J'ai d'abord touché Java ④
[Java] À propos des classes anonymes
A propos des méthodes de fractionnement (Java)
Qu'est-ce que l'encapsulation Java?
[Java Silver] À propos de l'initialisation
Ce que j'ai appris ② ~ Mock ~
A propos de la liste des baies Java
À propos du polymorphisme Java Super ()
Ce que j'ai appris ① ~ DJUnit ~
À propos de l'héritage (Java Silver)
À propos de la classe Java String
À propos des modificateurs d'accès Java
À propos des expressions Java lambda
Qu'est-ce que la technologie Java?
J'ai d'abord touché Java
À propos des points d'entrée Java
Prise en charge de Java 10 Docker