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.

Hamza Yerlikaya
la source
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

fouet
la source
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.

Jose Alban
la source
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é.

JustJeff
la source
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.

Codeur ZZ
la source
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.

dimo414
la source
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.

aperkins
la source
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

shoaib
la source
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).

Géant vert
la source
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

Tomasz Mularczyk
la source
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.

Sorantis
la source
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.
Steve Chambers
la source
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.

Subham Sood
la source