Modifier un fichier dans un pot


87

Je souhaite modifier un fichier dans mon jar. Est-il possible de faire cela sans extraire et réarranger, depuis mon application?

Les fichiers que je souhaite modifier sont des fichiers de configuration, principalement basés sur XML.

La raison pour laquelle je suis intéressé à ne pas contrarier est que l'application est enveloppée avec launch4j si je la désengage, je ne peux pas créer à nouveau le fichier .exe.


1
Je souhaite conserver les fichiers supplémentaires dans l'application sans créer de fichiers temporaires sur le système de fichiers.
Hamza Yerlikaya

Essayez cette solution stackoverflow.com/a/4837522/1853864 que j'ai utilisée et mes problèmes ont été résolus.
A. Magalhães

Pourriez-vous s'il vous plaît refuser la réponse actuellement acceptée? Il a un score négatif et n'est absolument pas utile
Dici

Réponses:


83

Vous pouvez utiliser l' uoption pourjar

À partir des didacticiels Java:

jar uf jar-file input-file(s)

"Tous les fichiers déjà dans l'archive ayant le même chemin qu'un fichier ajouté seront écrasés."

Voir Mise à jour d'un fichier JAR .

Bien mieux que de refaire le pot entier. L'appeler depuis votre programme semble également possible. Essayez d' exécuter la ligne de commande en Java


Impressionnant! Mais ils ont ajouté les chemins drôles. IE Bitbucket.foo.bar au lieu de com.etc.etc que l'existant a
StarWind0

26

Vous pouvez utiliser Vim:

vim my.jar

Vim est capable d'éditer des fichiers texte compressés, étant donné que vous avez unzipdans votre environnement.


3
C'est bien. Accédez au fichier que vous recherchez et appuyez sur Entrée. Modifiez le fichier, puis tapez: wq pour enregistrer!
Michael Butler

Vous avez également besoin zipdans votre environnement, de pouvoir enregistrer les modifications. Merci d'avoir répondu!
troig

11

Les fichiers jar Java sont au même format que les fichiers zip - donc si vous avez un utilitaire de fichier zip qui vous permettrait de modifier une archive, vous avez le pied dans la porte. Le deuxième problème est que si vous voulez recompiler une classe ou quelque chose du genre, vous n'aurez probablement qu'à reconstruire le fichier jar; mais un fichier texte ou quelque chose (xml, par exemple) devrait être assez facilement modifié.


8

Comme beaucoup l'ont dit, vous ne pouvez pas modifier un fichier dans un JAR sans recanalyser le JAR. C'est encore pire avec Launch4J, vous devez reconstruire l'EXE une fois que vous avez changé le JAR. Alors ne suivez pas cette voie.

C'est généralement une mauvaise idée de mettre les fichiers de configuration dans le JAR. Voici ma suggestion. Recherchez votre fichier de configuration dans des emplacements prédéterminés (comme le répertoire personnel, \ Program Files \ etc.). Si vous trouvez un fichier de configuration, utilisez-le. Sinon, utilisez celui du JAR comme solution de secours. Si vous faites cela, il vous suffit d'écrire le fichier de configuration à l'emplacement prédéterminé et le programme le récupérera.

Un autre avantage de cette approche est que le fichier de configuration modifié n'est pas écrasé si vous mettez à niveau votre logiciel.



2

Cela peut être plus de travail que ce que vous cherchez à faire à court terme, mais je suppose qu'à long terme, il serait très avantageux pour vous d'envisager d'utiliser Ant (ou Maven , ou même Bazel ) au lieu de construire des pots manuellement . De cette façon, vous pouvez simplement cliquer sur le fichier ant (si vous utilisez Eclipse) et reconstruire le bocal.

Alternativement, vous voudrez peut-être ne pas avoir du tout ces fichiers de configuration dans le fichier jar - si vous prévoyez de devoir remplacer ces fichiers régulièrement, ou s'il est censé être distribué à plusieurs parties, le fichier de configuration ne devrait pas faire partie de le pot du tout.


2
D'accord. Cependant, vous voudrez peut-être mettre un fichier de configuration "par défaut" dans le JAR, donc si quelque chose arrive au fichier externe (corrompu, supprimé, etc.), vous pouvez revenir à une configuration par défaut.
Thomas Owens

C'est vrai - même si je ne sais pas combien d'applications continueraient à fonctionner sans leurs fichiers de configuration ...
dimo414

1

Pour développer ce que dit dfa, la raison est que le fichier jar est configuré comme un fichier zip. Si vous souhaitez modifier le fichier, vous devez lire toutes les entrées, modifier celle que vous souhaitez modifier, puis réécrire les entrées dans le fichier jar. J'ai dû le faire auparavant, et c'était la seule façon que je pouvais trouver pour le faire.

ÉDITER

Notez que cela utilise les éditeurs de fichiers jar internes à Java, qui sont des flux de fichiers. Je suis sûr qu'il existe un moyen de le faire, vous pouvez lire l'intégralité du fichier jar en mémoire, tout modifier, puis réécrire dans un flux de fichiers. C'est ce que je pense que font des utilitaires comme 7-Zip et d'autres, car je pense que la ToC d'un en-tête zip doit être définie au moment de l'écriture. Cependant, je peux me tromper.


1

Oui, vous pouvez, en utilisant SQLite, vous pouvez lire ou écrire dans une base de données à partir du fichier jar, de sorte que vous n'ayez pas à l'extraire puis à le re-jar, suivez mon message http://shoaibinamdar.in/blog/? p = 313

en utilisant la syntaxe «jdbc: sqlite :: resource:», vous pourrez lire et écrire dans une base de données à partir du fichier jar


1
Bonjour, bienvenue sur stackoverflow. J'ai supprimé les abréviations de votre message. En général, la sténographie de style de message texte n'est pas appropriée ici. Je pense que cette réponse serait une bonne réponse à la question si vous incluiez davantage de détails de votre blog, dans la réponse elle-même, de sorte que quelqu'un qui lit votre réponse apprenne quelque chose même s'il ne lit pas le blog, ou il est déplacé vers une autre URL à une date ultérieure.
Flexo

1

Découvrez TrueZip .

Il fait exactement ce que vous voulez (éditer des fichiers en ligne dans un fichier jar), via une API de système de fichiers virtuel. Il prend également en charge les archives imbriquées (jar dans un jar).


1

Extraire le fichier jar par ex. avec winrar et utilisez CAVAJ:

Cavaj Java Decompiler est un utilitaire graphique gratuit qui reconstruit le code source Java à partir de fichiers CLASS.

voici un tutoriel vidéo si vous avez besoin: https://www.youtube.com/watch?v=ByLUeem7680


eh bien, le logiciel "Use CAVAJ" est la réponse ici. Le lien n'est qu'un ajout si des explications supplémentaires sont nécessaires.
Tomasz Mularczyk

0

Tant que ce fichier n'est pas .class, c'est-à-dire un fichier de ressources ou un fichier manifeste, vous le pouvez.


et comment, sans extraire et re-jarring?
user85421

0

Le moyen le plus simple que j'ai trouvé pour le faire dans Windows est avec WinRAR :

  1. Cliquez avec le bouton droit sur le fichier et choisissez "Ouvrir avec WinRAR" dans le menu contextuel.
  2. Accédez au fichier à éditer et double-cliquez dessus pour l'ouvrir dans l'éditeur par défaut.
  3. Après avoir effectué les modifications, enregistrez et quittez l'éditeur.
  4. Un dialogue apparaîtra alors vous demandant si vous souhaitez mettre à jour le fichier dans l'archive - choisissez "Oui" et le JAR sera mis à jour.

0

la plupart des réponses ci-dessus indiquent que vous ne pouvez pas le faire pour le fichier de classe.

Même si vous souhaitez mettre à jour le fichier de classe, vous pouvez le faire également. Tout ce que vous avez à faire est de faire glisser et déposer le fichier de classe de votre espace de travail dans le pot.

Si vous souhaitez vérifier vos modifications dans le fichier de classe, vous pouvez le faire en utilisant un décompilateur comme jd-gui.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.