7
votes

Comment charger un dossier d'un .jar?

OK. J'ai donc une question assez simple: je veux pouvoir charger une ressource (un dossier entier) de l'intérieur d'un fichier .jar en cours d'exécution, mais je n'ai pas pu le faire fonctionner. C'est ce que j'ai essayé (si le nom de la classe était "myClass" et que le dossier est appelé "myFolder"), mais il jette toujours une nullpoinpointeexception: xxx

la nullpointerexception est toujours lancée avant de Créer "MyFolder".

Quelques informations supplémentaires: Je dois accéder au dossier du contexte statique. La classe qui accède au dossier n'est pas dans le même répertoire que le dossier lui-même. (Le dossier est dans le répertoire racine à l'intérieur du pot, la classe est un couple de sous-packages vers le bas.)

Est-ce que quelqu'un avoir une solution à mon problème? Désolé si j'ai utilisé une mauvaise terminologie: P, mais tout ce que vous pouvez faire pour aider est apprécié.


1 commentaires

@usernnnn: "J'ai une question assez simple:" "Quel est le sens de la vie?" est une simple question. C'est la réponse qui est délicate. BTW - Depuis que vous avez apparemment placé les fichiers dans le pot, pourquoi ne pas inclure une liste d'entre eux dans un seul fichier qui a un nom de jeu. Problème résolu!


4 Réponses :


21
votes

Il n'y a aucun moyen que cela fonctionnera. Vous essayez de créer un objet de fichier à partir d'une ressource à l'intérieur d'un pot. Ça ne va pas arriver. La meilleure méthode pour charger des ressources est de créer un dossier de votre package un dossier de ressources, puis de créer des ressources.jar dans celui-ci ou quelque chose, vider vos ressources dans le même Dir, puis utilisez ressources.class.getresourceastream (resfilename) dans vos autres fichiers de classe Java.

Si vous avez besoin de "Force brute", les sous-diffamas du répertoire JAR indiqués par l'URL donnée par getresource (..) , utilisez le Suivant (bien que ce soit un peu de hack!). Il fonctionnera aussi pour un système de fichiers normal aussi: xxx

Vous pouvez ensuite modifier l'URL donnée par getresource (..) et ajoute le fichier sur le fichier fin, et transmettez ces URL dans getresourceastream (..) , prêt pour le chargement. Si vous n'avez pas compris cela, vous devez lire sur la classement.


4 commentaires

@param Clazz Toute classe Java qui vit au même endroit que les ressources que vous souhaitez. "au même endroit" que dans le même pot, ou ...?


Gardez à l'esprit qu'il existe une différence entre getclass (). GetClassloader (). GetResource (...) et getclass (). GetResource (...) . Il en va de même pour getresourceastream (...) . Cela ressemble à la version «sans fondement» qui utilise la racine du pot comme la racine, essentiellement. Essayez-le - Placez un dossier Ressources à la racine de votre pot et voyez s'il peut répertorier les fichiers.


Grâce à vous (et à Greg Briggs) pour cela, il est incroyable à quel point certaines opérations de fichiers peuvent être complexes à Java. Bien sûr, cela est parfaitement logique maintenant que je vois le code, mais avant cela ... Oh mec.


Notez que vous pouvez obtenir l'emplacement du pot d'une classe à l'aide de Clazz.geprotectionDomain (). GetCodesource (). GetLocation ().



1
votes

C'est assez simple: xxx

retournerait un flux d'entrée pouvant être utilisé comme: xxx

et de là, utiliser votre image comment vous aimez. Cela fonctionne également aussi bien que si vous utilisez le flux d'entrée pour lire un fichier texte ou à peu près tout ce que vous faites.

EDIT: Le chemin ci-dessus est relatif à la racine de .jar.


6 commentaires

Lorsque vous dites getclass , faisez-vous référence à getclass () ?


Et que se passe-t-il si la classe qui accède au dossier est dans, disons, myjar.mypackage.myfirstssubpackage.mysecondsubpackage et le dossier est simplement dans Myjar.MyFolder?


D'accord merci. Donc, je pouvais faire cela: fichier myFolder = myClass.class.getsourceastream ("/ myFolder /") non? attendez non ça ne fonctionnerait pas: p


Voilà NO Way Vous pouvez obtenir un objet de fichier à partir d'un pot. Certainement pas. L'API ne le permet pas. Sortez-le de votre tête :)


MDR. Je dois donc faire plus de travail xD. Eh bien ... tant pour ça. Merci d'avoir essayé de m'aider cependant :)


Je parlais de getclass (), désolé. Et oui, il n'y a aucun moyen d'obtenir un objet de fichier à moins que ce soit un fichier externe. Vous devrez repenser ce que vous faites. Bonne chance!



0
votes

Je pense que je suis sur quelque chose. Dans Eclipse, effectuez un nouveau dossier source nommé "Ressources" et dans ce dossier, crée un package nommé "MyFolder". Avoir une voie à "MyFolder", il vous suffit de dire:

Path path = Paths.get(Main.class.getResource("/myFolder").toURI()); // or the class name instead of Main


0 commentaires

0
votes

Jusqu'à présent (décembre 2017), il s'agit de la seule solution que j'ai trouvée qui fonctionne à la fois à l'intérieur et à l'extérieur de l'IDE (en utilisant pathmatchingResourcepatternresolver ): Httpts://stackoverflow.com/a/47904173/6792588


0 commentaires