Modificando um arquivo dentro de um jar

87

Eu gostaria de modificar um arquivo dentro do meu jar. É possível fazer isso sem extrair e causar choque, de dentro do meu aplicativo?

Os arquivos que eu quero modificar são arquivos de configuração, principalmente baseados em xml.

O motivo pelo qual estou interessado em não descomplicar é que o aplicativo é empacotado com launch4j, se eu descompactá-lo, não consigo criar o arquivo .exe novamente.

Hamza Yerlikaya
fonte
1
Eu gostaria de manter os arquivos suplementares dentro do aplicativo sem criar arquivos temporários no sistema de arquivos.
Hamza Yerlikaya
Experimente esta solução stackoverflow.com/a/4837522/1853864 que usei e meus problemas foram resolvidos.
A. Magalhães
Você poderia, por favor, não aceitar a resposta atualmente aceita? Tem uma pontuação negativa e não é absolutamente útil
Dici

Respostas:

83

Você pode usar a uopção parajar

Dos tutoriais Java:

jar uf jar-file input-file(s)

"Todos os arquivos que já estão no pacote com o mesmo caminho de um arquivo adicionado serão sobrescritos."

Consulte Atualizando um arquivo JAR .

Muito melhor do que fazer o pote inteiro de novo. Invocá-lo de dentro do programa também parece possível. Tente executar a linha de comando em Java

clwhisk
fonte
Impressionante! Mas eles adicionaram os nomes de caminho engraçados. IE Bitbucket.foo.bar em vez do com.etc.etc que o existente tem
StarWind0
26

Você pode usar o Vim:

vim my.jar

O Vim é capaz de editar arquivos de texto compactados, desde que você tenha unzipem seu ambiente.

Jose Alban
fonte
3
Isso é ótimo. Navegue até o arquivo que você está procurando e pressione Enter. Edite o arquivo e digite: wq para salvar!
Michael Butler
Além disso, você precisa zipem seu ambiente, ser capaz de salvar as alterações. Obrigado pela resposta!
troig
11

Os arquivos Java jar têm o mesmo formato que os arquivos zip - então, se você tiver um utilitário de arquivo zip que permite modificar um arquivo, está pronto para começar. O segundo problema é, se você quiser recompilar uma classe ou algo assim, provavelmente terá que reconstruir o jar; mas um arquivo de texto ou algo (xml, por exemplo) deve ser facilmente modificado.

JustJeff
fonte
8

Como muitos já disseram, você não pode alterar um arquivo em um JAR sem reler o JAR. É ainda pior com o Launch4J, você tem que reconstruir o EXE depois de alterar o JAR. Portanto, não siga este 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 diretório inicial, \ Arquivos de programas \ etc). Se você encontrar um arquivo de configuração, use-o. Caso contrário, use o do JAR como fallback. Se você fizer isso, você só precisa escrever o arquivo de configuração no local pré-determinado e o programa irá pegá-lo.

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

ZZ Coder
fonte
2

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

Alternativamente, você pode querer não ter esses arquivos de configuração no jar - se você espera precisar substituir esses arquivos regularmente, ou se for para ser distribuído para várias partes, o arquivo de configuração não deve fazer parte do a jarra em tudo.

dimo414
fonte
2
Acordado. No entanto, você pode querer colocar um arquivo de configuração "padrão" no JAR, então, se algo acontecer com o externo (corrompido, excluído, etc), você pode voltar para a configuração padrão.
Thomas Owens
Verdade - embora eu não saiba quantos aplicativos continuariam a funcionar sem seus arquivos de configuração ...
dimo414
1

Para expandir o que dfa disse, o motivo é porque o arquivo jar é configurado como um arquivo zip. Se quiser modificar o arquivo, você deve ler todas as entradas, modificar aquela que deseja alterar e, em seguida, gravar as entradas de volta no arquivo jar. Já tive que fazer isso antes, e essa foi a única maneira que encontrei para fazer isso.

EDITAR

Observe que isso está usando os editores de arquivo jar interno para Java, que são fluxos de arquivo. Tenho certeza de que há uma maneira de fazer isso, você pode ler o jar inteiro na memória, modificar tudo e, em seguida, escrever de volta em um fluxo de arquivo. Isso é o que acredito que utilitários como o 7-Zip e outros estão fazendo, pois acredito que o ToC de um cabeçalho zip deve ser definido no momento da gravação. No entanto, posso estar errado.

aperkins
fonte
1

Sim, você pode, usando o SQLite, você pode ler ou gravar em um banco de dados de dentro do arquivo jar, de modo que não tenha que extraí-lo e depois recuperá-lo, siga meu post http://shoaibinamdar.in/blog/? p = 313

usando a sintaxe "jdbc: sqlite :: resource:" você seria capaz de ler e gravar em um banco de dados de dentro do arquivo jar

Shoaib
fonte
1
Olá, bem-vindo ao stackoverflow. Removi as abreviações de sua postagem. Em geral, o estilo de mensagem curta não é apropriado aqui. Acho que essa resposta seria uma boa resposta à pergunta se você incluísse mais alguns detalhes do seu blog, dentro da própria resposta, para que alguém que esteja lendo sua resposta aprenda algo mesmo que não leia o blog ou ele seja movido para outro URL em alguma data futura.
Flexo
1

Confira TrueZip .

Ele faz exatamente o que você deseja (editar arquivos sequencialmente dentro de um arquivo jar), por meio de uma API de sistema de arquivos virtual. Ele também oferece suporte a arquivos aninhados (jar dentro de um jar).

Gigante verde
fonte
1

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

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

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

Tomasz Mularczyk
fonte
bem, o software "Use CAVAJ" é a resposta aqui. O link é apenas uma adição se qualquer explicação extra for necessária.
Tomasz Mularczyk
0

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

Sorantis
fonte
e como, sem extrair e reabrir?
user85421
0

A maneira mais simples que descobri de fazer isso no Windows é com o WinRAR :

  1. Clique com o botão direito do mouse no arquivo e escolha "Abrir com 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. Uma caixa de diálogo aparecerá perguntando se você deseja atualizar o arquivo no arquivo - escolha "Sim" e o JAR será atualizado.
Steve Chambers
fonte
0

a maioria das respostas acima diz que você não pode fazer isso para o arquivo da classe.

Mesmo se você quiser atualizar o arquivo de classe, você também pode fazer isso. Tudo o que você precisa fazer é arrastar e soltar o arquivo de classe do seu espaço de trabalho no jar.

Caso queira verificar suas mudanças no arquivo de classe, você pode fazer isso usando um descompilador como o jd-gui.

Subham Sood
fonte