A minha idéia é simples. Eu gostaria de atualizar via programação um arquivo binário que esta empacotado em jar, sendo que a classe que deve fazer isso está dentro do mesmo jar, ou seja, ele está sendo executado. Alguém já fez isso? Tem alguma idéia por onde posso começar?
Aham, se não me engano você não pode fazer isso devido ao seguinte motivo: durante a execução de um jar, o java.exe deixa esse jar aberto para leitura (ele mapeia em memória uma tabelinha que existe no final do arquivo .jar e que contém a lista dos arquivos .class contidos dentro desse arquivo).
Só que enquanto ele está com esse arquivo aberto você não pode mexer nele (ou seja, abrir para gravação), quanto mais atualizar escrevendo diretamente nesse arquivo.
Acho que talvez dê para você criar uma cópia desse jar, fazendo as alterações, renomear o jar que está sendo executado, e renomear o jar “atualizado” para o nome original. Na próxima vez que o programa for executado, ele iria pegar o novo jar. (Não, ele não pega a alteração enquanto está executando)
É um bocado complicado, você pode tentar mas não “agaranto o seu sucéssio”.
Pelo que você disse, se não é possível alterar o conteúdo do jar, também não é possível renomeá-lo.
Eu posso deixar a classe que atualiza em outro .jar, criando um módulo de atualização para meu sistema. Mas a minha dúvida principal é como substituir ou incluir um arquivo que no .jar. Sabendo isso o resto eu me viro.
Obrigado pela atenção
Se você der uma olhada no fonte do jar.exe (ele vem com os fontes completos do JDK, não no src.zip. ) você provavelmente vai descobrir que ele lê o jar original inteirinho e vai incluindo ou removendo os arquivos em um outro jar temporário, depois deleta o jar original e renomeiao o jar temporário.
(não olhei lá ainda, mas é sempre legal baixar os fontes completos - procure “SCSL” ou “JRL” source code.)
É que o formato ZIP (que é o que o JAR usa) não é adequado para ser dinamicamente alterado - não é um “filesystem dentro de um arquivo”, como é o caso do “OLE Compound Document”, usado pelo Word e pelo Excel, que basicamente é um filesystem FAT dentro de um arquivo. Qualquer programa que mexe com ZIPs normalmente usa um temporário para poder fazer modificações.
Tudo bem, até aí beleza, pois executando um jar externo para efetuar as atualizações do meu programa, eu conseguiria efetuar as alterações necessárias no jar principal sem problemas de ele estar aberto e bloqueado apra alterações pela máquina virtual.
Tudo que eu não sei fazer e é o que estou procurando, é saber como eu manipulo o conteúdo de um arquivo .jar, ou seja como eu enpacoto um jar via programação e não utilziando o jar.exe e também como eu posso ler o conteúdo de um jar via programacao.
http://java.sun.com/j2se/1.4.2/docs/api/java/util/jar/package-summary.html
É um pouco trabalhoso, mas nada que lhe faça ficar acordado até de madrugada…
Valeu mesmo…
Vou dar uma olhada e qualquer coisa eu recorro ao fórum…
Obrigadão pela paciência…
O que você quer não é fazer atualização do sistema?
Iria recomendar um tipo de mecanismo na inicialização ele baixa e reinicia a aplicação, assim como o eclipse. Se for eu acho “quase” impossível fazer atualização, pois jar é uma forma de distribuição totalmente centralizada, que teria que fazer a atualização total do sistema e ainda se o jar tiver um tamanho consideravelmente grande será inviavel.
Seria bacana via class, mas existe um referendo no Java Community Process que estão fazendo pesquisas para a substituição do jar.
Editado
Discussão sobre a morte ao jars aqui