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.


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


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.


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.


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.



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.


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.


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


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).


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


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.


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.

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.