2017-09-24 7 views
4

Je jouais avec JShell après la sortie de Java 9, et j'ai essayé d'importer un paquet que j'avais fait. Comme l'ensemble de l'application pour laquelle je code est contenu dans ce paquet, chaque classe sauf une (que je n'ai pas encore codée) est paquet-private. Mon classpath est correct, mais je ne peux toujours utiliser aucun des types déclarés dans le paquet dans JShell (il lance une erreur "can not find symbol"). Ai-je besoin de les rendre publics pour qu'ils soient accessibles, ou est-il possible de tester les classes private-package?? Voici le code exact que j'ai essayé.Importer des classes Private-Package vers JShell

Mon répertoire courant est

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src 

Mon chemin de classe est

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls 

et le répertoire du paquet (pour le bytecode) est

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls\collatz 

CollatzSequence est un package- classe privée contenue dans collatz.

PS C:\Users\Sylvaenn> cd OneDrive\Documents\Programs\Java\src 
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> jshell 
| Welcome to JShell -- Version 9 
| For an introduction type: /help intro 

jshell> import collatz.*; 

jshell> CollatzSequence seq = new CollatzSequence(BigInteger.ONE); 
| Error: 
| cannot find symbol 
| symbol: class CollatzSequence 
| CollatzSequence seq = new CollatzSequence(BigInteger.ONE); 
| ^-------------^ 
| Error: 
| cannot find symbol 
| symbol: class CollatzSequence 
| CollatzSequence seq = new CollatzSequence(BigInteger.ONE); 
|       ^-------------^ 

jshell> /imports 
| import java.io.* 
| import java.math.* 
| import java.net.* 
| import java.nio.file.* 
| import java.util.* 
| import java.util.concurrent.* 
| import java.util.function.* 
| import java.util.prefs.* 
| import java.util.regex.* 
| import java.util.stream.* 
| import collatz.* 

jshell> 
+2

Pourriez-vous s'il vous plaît partager un code reproductible pour le scénario? Cela aiderait à clarifier la question. – nullpointer

+1

Je l'ai juste inclus dans mon édition. –

Répondre

1

Pour autant que je sais (corrigez-moi si je me trompe), vous ne pouvez pas créer une classe dans un emballage spécifique utilisant JShell (classes créées au sein JShell sont toujours dans le package par défaut). Cela étant dit, vous ne pouvez pas accéder à vos classes private-package à partir de JShell. C'est un comportement Java "normal".

+0

En ce qui concerne la création d'une classe dans un paquet spécifique, je ne pouvais pas trouver un moyen de le faire avec les commandes JShell, et il est logique que vous ne puissiez pas le faire, mais je ne sais pas avec certitude.Et je suppose que ne pas être en mesure d'accéder à des cours privés-paquet a aussi du sens, mais c'est une énorme déception. –

2

De l'JEP n ° 220 - The Java Shell (Read-Eval-Print Loop)

Un extrait ne peut pas déclarer un paquet ou un module. Tout le code JShell est placé dans un seul paquet dans un module sans nom. Le nom du package est contrôlé par JShell.

C'est probablement la raison pour laquelle vous ne pouvez pas déclarer package dans JShell.


Comme le suggère tool documentation que vous pouvez donner à ce essayer: -

Le script de démarrage par défaut est constitué de plusieurs importations communes. Vous pouvez personnaliser vos entrées de démarrage avec la commande de démarrage /set.

où vous pouvez set the classpath ou the modulepath de la classe que vous utiliser:

jshell --class-path C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls 
+0

Informations très utiles, mais je n'essaie pas de déclarer un nouveau paquet; J'essaye d'accéder aux classes paquet-privé dans un existant. Mon chemin de classe pointe déjà vers le répertoire correct, mais je vais essayer de le définir explicitement dans le shell. Cependant, je pense que la réponse acceptée est juste; seules les classes publiques sont accessibles à JShell. –