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.
Respostas:
Você pode usar a
u
opção parajar
Dos tutoriais Java:
"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
fonte
Você pode usar o Vim:
vim my.jar
O Vim é capaz de editar arquivos de texto compactados, desde que você tenha
unzip
em seu ambiente.fonte
zip
em seu ambiente, ser capaz de salvar as alterações. Obrigado pela resposta!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.
fonte
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.
fonte
Não tenho certeza se isso ajuda, mas você pode editar sem extrair:
Verifique a postagem do blog para obter mais detalhes http://vinurip.blogspot.com/2015/04/how-to-edit-contents-of-jar-file-on-mac.html
fonte
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.
fonte
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.
fonte
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
fonte
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).
fonte
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
fonte
Contanto que este arquivo não seja .class, ou seja, arquivo de recurso ou arquivo de manifesto - você pode.
fonte
A maneira mais simples que descobri de fazer isso no Windows é com o WinRAR :
fonte
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.
fonte