Modifica di un file all'interno di un jar


88

Vorrei modificare un file all'interno del mio jar. È possibile farlo senza estrarre e ribattere dall'interno della mia applicazione?

I file che voglio modificare sono file di configurazione, principalmente basati su xml.

Il motivo per cui sono interessato a non sciogliere è che l'applicazione è inclusa con launch4j se lo apro non posso creare nuovamente il file .exe.


1
Vorrei mantenere i file supplementari all'interno dell'applicazione senza creare file temporanei sul file system.
Hamza Yerlikaya

Prova questa soluzione stackoverflow.com/a/4837522/1853864 che ho usato e i miei problemi sono stati risolti.
A. Magalhães

Potresti annullare la risposta attualmente accettata? Ha un punteggio negativo e non è assolutamente d'aiuto
Dici

Risposte:


84

Puoi usare l' uopzione perjar

Dai tutorial Java:

jar uf jar-file input-file(s)

"Tutti i file già presenti nell'archivio con lo stesso percorso di un file aggiunto verranno sovrascritti."

Vedere Aggiornamento di un file JAR .

Molto meglio che rifare l'intero barattolo. Anche richiamarlo dall'interno del tuo programma sembra possibile. Prova a eseguire la riga di comando in Java


Eccezionale! Ma hanno aggiunto i nomi di percorso divertenti. IE Bitbucket.foo.bar invece di com.etc.etc quello esistente ha
StarWind0

26

Puoi usare Vim:

vim my.jar

Vim è in grado di modificare file di testo compressi, dato che hai unzipnel tuo ambiente.


3
Questo è fantastico. Vai al file che stai cercando e premi Invio. Modifica il file, quindi digita: wq per salvare!
Michael Butler,

Inoltre è necessario zipnel tuo ambiente, per essere in grado di salvare le modifiche. Grazie per la risposta!
troig

11

I file jar Java hanno lo stesso formato dei file zip, quindi se hai un'utilità di file zip che ti consente di modificare un archivio, hai il piede nella porta. Il secondo problema è, se vuoi ricompilare una classe o qualcosa del genere, probabilmente dovrai solo ricostruire il vaso; ma un file di testo o qualcosa del genere (xml, per esempio) dovrebbe essere facilmente modificato.


8

Come molti hanno detto, non è possibile modificare un file in un JAR senza ripetere la scansione del JAR. È anche peggio con Launch4J, devi ricostruire l'EXE una volta cambiato il JAR. Quindi non seguire questa strada.

In genere è una cattiva idea mettere i file di configurazione nel JAR. Ecco il mio suggerimento. Cerca il tuo file di configurazione in alcune posizioni predeterminate (come directory home, \ Programmi \ ecc.). Se trovi un file di configurazione, usalo. Altrimenti, usa quello nel JAR come fallback. Se lo fai, devi solo scrivere il file di configurazione nella posizione predeterminata e il programma lo raccoglierà.

Un altro vantaggio di questo approccio è che il file di configurazione modificato non viene sovrascritto se si aggiorna il software.



2

Questo potrebbe essere più lavoro di quello che stai cercando di affrontare a breve termine, ma sospetto che a lungo termine sarebbe molto vantaggioso per te cercare di utilizzare Ant (o Maven , o anche Bazel ) invece di costruire manualmente il vaso . In questo modo puoi semplicemente fare clic sul file ant (se usi Eclipse) e ricostruire il jar.

In alternativa, potresti non voler effettivamente avere questi file di configurazione nel jar - se ti aspetti di dover sostituire questi file regolarmente, o se dovrebbe essere distribuito a più parti, il file di configurazione non dovrebbe far parte di il barattolo a tutti.


2
Concordato. Tuttavia, potresti voler mettere un file di configurazione "predefinito" nel JAR, quindi se succede qualcosa a quello esterno (danneggiato, cancellato, ecc.), Puoi tornare a una configurazione predefinita.
Thomas Owens

Vero, anche se non so quante applicazioni continuerebbero a funzionare senza i loro file di configurazione ...
dimo414

1

Per espandere ciò che ha detto dfa, il motivo è perché il file jar è impostato come un file zip. Se vuoi modificare il file, devi leggere tutte le voci, modificare quella che vuoi cambiare e quindi riscrivere le voci nel file jar. L'ho dovuto fare prima, ed era l'unico modo che ho trovato per farlo.

MODIFICARE

Si noti che questo utilizza gli editor di file jar interni a Java, che sono flussi di file. Sono sicuro che ci sia un modo per farlo, potresti leggere l'intero jar in memoria, modificare tutto, quindi riscrivere in un flusso di file. Questo è ciò che credo stiano facendo utilità come 7-Zip e altri, poiché credo che il ToC di un'intestazione zip debba essere definito al momento della scrittura. Tuttavia, potrei sbagliarmi.


1

Sì, puoi, usando SQLite puoi leggere o scrivere su un database dall'interno del file jar, in modo da non doverlo estrarre e poi re jar, segui il mio post http://shoaibinamdar.in/blog/? p = 313

utilizzando la sintassi "jdbc: sqlite :: resource:" saresti in grado di leggere e scrivere su un database dall'interno del file jar


1
Ciao, benvenuto in stackoverflow. Ho rimosso le abbreviazioni dal tuo post. In generale, la stenografia dello stile del messaggio di testo non è appropriata qui. Penso che questa risposta sarebbe una buona risposta alla domanda se includessi qualche dettaglio in più dal tuo blog, all'interno della risposta stessa in modo che qualcuno che legge la tua risposta impari qualcosa anche se non legge il blog, o viene spostato a un altro URL in una data futura.
Flexo

1

Dai un'occhiata a TrueZip .

Fa esattamente quello che vuoi (per modificare i file in linea all'interno di un file jar), attraverso un'API di file system virtuale. Supporta anche archivi nidificati (jar all'interno di un jar).


1

Estrai il file jar per es. con winrar e usa CAVAJ:

Cavaj Java Decompiler è un'utilità grafica freeware che ricostruisce il codice sorgente Java da file CLASS.

ecco il video tutorial se necessario: https://www.youtube.com/watch?v=ByLUeem7680


bene, il software "Usa CAVAJ" è la risposta qui. Il collegamento è solo un'aggiunta se è necessaria una spiegazione aggiuntiva.
Tomasz Mularczyk

0

Finché questo file non è .class, cioè un file di risorse o un file manifest, puoi farlo.


e come, senza estrarre e rimescolare?
user85421

0

Il modo più semplice che ho trovato per farlo in Windows è con WinRAR :

  1. Fare clic con il tasto destro sul file e scegliere "Apri con WinRAR" dal menu contestuale.
  2. Individua il file da modificare e fai doppio clic su di esso per aprirlo nell'editor predefinito.
  3. Dopo aver apportato le modifiche, salva e esci dall'editor.
  4. Apparirà quindi una finestra di dialogo che ti chiederà se desideri aggiornare il file nell'archivio: scegli "Sì" e il JAR verrà aggiornato.

0

la maggior parte delle risposte sopra dicono che non puoi farlo per il file di classe.

Anche se vuoi aggiornare il file di classe puoi farlo anche tu. Tutto quello che devi fare è trascinare e rilasciare il file di classe dal tuo spazio di lavoro nel jar.

Nel caso in cui desideri verificare le modifiche nel file di classe, puoi farlo utilizzando un decompilatore come jd-gui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.