Modificando um arquivo dentro de um jar

Eu gostaria de modificar um arquivo dentro do meu jar. É possível fazer isso sem extrair e reprimir, de dentro da minha aplicação?

Arquivo que eu quero modificar são arquivos de configuração, principalmente xml com base.

A razão que eu estou interessado em não desarrumar é que o aplicativo é empacotado com launch4j se eu unjar ele não posso criar o arquivo. Exe novamente.

Você pode usar a opção u para jar

Nos Tutoriais de Java:

 jar uf jar-file input-file(s) 

“Todos os arquivos que já estão no arquivo com o mesmo nome de caminho de um arquivo que está sendo adicionado serão sobrescritos.”

Consulte Atualizando um Arquivo JAR .

Muito melhor do que fazer todo o jarro de novo. Invocar isso de dentro do seu programa também é possível. Tente executar a linha de comando em Java

Os arquivos jar do Java são o mesmo formato dos arquivos zip – assim, se você tiver um utilitário de arquivo zip que permita modificar um arquivo, você terá o pé na porta. O segundo problema é, se você quiser recompilar uma class ou algo assim, você provavelmente terá que re-construir o jar; mas um arquivo de texto ou algo assim (xml, por exemplo) deve ser facilmente modificado.

Você pode usar o Vim:

vim my.jar

O Vim é capaz de editar arquivos de texto compactados, já que você unzip em seu ambiente.

Como muitos disseram, você não pode alterar um arquivo em um JAR sem recanear o JAR. É ainda pior com o Launch4J, você tem que reconstruir o EXE depois de alterar o JAR. Então não siga esse caminho.

Geralmente é uma má ideia colocar arquivos de configuração no JAR. Aqui está minha sugestão. Procure seu arquivo de configuração em alguns locais pré-determinados (como o diretório pessoal, \ Arquivos de Programas \ etc). Se você encontrar um arquivo de configuração, use-o. Caso contrário, use o no JAR como fallback. Se você fizer isso, você só precisa escrever o arquivo de configuração no local pré-determinado e o programa irá buscá-lo.

Outro benefício dessa abordagem é que o arquivo de configuração modificado não será substituído se você atualizar seu software.

Isso pode ser mais trabalho do que você está procurando para lidar a curto prazo, mas eu suspeito que a longo prazo seria muito benéfico para você olhar para o uso de Ant (ou Maven , ou mesmo Bazel ) em vez de construir jar manualmente . Dessa forma, você pode simplesmente clicar no arquivo ant (se você usar o Eclipse) e reconstruir o jar.

Alternativamente, você pode querer realmente não ter esses arquivos de configuração no jar em tudo – se você está esperando para precisar replace esses arquivos regularmente, ou se é suposto ser distribuído para várias partes, o arquivo de configuração não deve ser parte de o flask em tudo.

Para expandir o que o dfa disse, o motivo é porque o arquivo jar está configurado como um arquivo zip. Se você quiser modificar o arquivo, deverá ler todas as inputs, modificar a que deseja alterar e, em seguida, gravar as inputs novamente no arquivo jar. Eu tive que fazer isso antes, e essa foi a única maneira que eu poderia encontrar para fazê-lo.

EDITAR

Observe que isso está usando os editores de arquivos jar internos para Java, que são streams de arquivos. Eu tenho certeza que existe uma maneira de fazer isso, você pode ler o jar inteiro na memory, modificar tudo, e então escrever de volta para um stream de arquivos. Isso é o que eu acredito que utilitários como o 7-Zip e outros estão fazendo, como eu acredito que o ToC de um header zip tem que ser definido no momento da gravação. No entanto, eu posso estar errado.

Sim, você pode, usando o SQLite, você pode ler ou gravar em um database a partir do arquivo jar, para que você não tenha que extrair e re-jar, siga o meu post http://shoaibinamdar.in/blog/? p = 313

usando a syntax “jdbc: sqlite :: resource:” você seria capaz de ler e gravar em um database a partir do arquivo jar

Confira o TrueZip .

Ele faz exatamente o que você quer (para editar arquivos em linha dentro de um arquivo jar), através de uma API do sistema de arquivos virtual. Ele também suporta arquivos nesteds (jar dentro de um jar) também.

Extraia o arquivo jar para ex. com winrar e use o CAVAJ:

Cavaj Java Decompiler é um utilitário freeware gráfico que reconstrói código fonte Java a partir de arquivos CLASS.

aqui está o tutorial em vídeo se você precisar: https://www.youtube.com/watch?v=ByLUeem7680

Não tenho certeza se isso ajuda, mas você pode editar sem extrair:

  1. Abra o arquivo jar do editor vi
  2. Selecione o arquivo que você deseja editar na lista
  3. Pressione enter para abrir o arquivo, faça os trocadores e salve-o bem simples

Confira a postagem no blog para mais detalhes http://vinurip.blogspot.com/2015/04/how-to-edit-contents-of-jar-file-on-mac.html

Contanto que este arquivo não seja .class, ou seja, arquivo de resources ou arquivo de manifesto – você pode.

A maneira mais simples que encontrei para fazer isso no Windows é com o WinRAR :

  1. Clique com o botão direito do mouse no arquivo e escolha “Abrir com o WinRAR” no menu de contexto.
  2. Navegue até o arquivo a ser editado e clique duas vezes nele para abri-lo no editor padrão.
  3. Depois de fazer as alterações, salve e saia do editor.
  4. Um diálogo aparecerá perguntando se você deseja atualizar o arquivo no arquivo – escolha “Sim” e o JAR será atualizado.