[RESOLVIDO] Como impedir duas instâncias do meu programa

Tenho um aplicativo em Swing.

Quando rodo meu programa através do .jar, abre minha tela, normal.

Queria que se eu clicasse no .jar de novo, o programa não executasse novamente.

Alguém poderia me ajudar em como fazer isso?

Desde já agradeço a todos

Estratégias comuns:

  1. aplicação cria um arquivo de lock (se Java 1.4 ou superior) em um lugar determinado. Novas instâncias falham em obter o lock no arquivo e se recusam a iniciar

  2. aplicação inicia um server socket numa porta determinada. Próxima instância falha ao tentar fazer o mesmo (possivelmente dispara aviso do firewall).

Eclipse usa “1”. Veja também esta thread nos fóruns da Sun:

http://forum.java.sun.com/thread.jspa?threadID=565828&messageID=4101278

O que você quer dizer com eclipse usa 1?

[quote=paulohrl]O que você quer dizer com eclipse usa 1?
[/quote]

Eu entendi o que é o 1, mas o eclipse, pelo que eu sei não usa isso, ele permite rodar mais de uma instância do programa.

Procure no workspace do Eclipse um arquivo em .metadata/.lock . Ele não permite mais de uma instância em um workspace. O que terias que fazer é referenciar um único arquivo, que funcionaria de maneira semelhante ao Eclipse.

Até!

Mas eu consigo rodar duas instâncias do meu programa ao mesmo tempo no eclipse…

Como seria feito esse controle com o arquivo? quando iniciar o aplicativo eu abro o acesso a esse arquivo? o que me impediria de outra instância também abrir esse acesso?

O seu programa teria que criar um arquivo que seria sua chave. Quando iniciar, ele procura esse arquivo e tenta abrir (usando uma API de arquivo blocante, para isso basta procurar um pouco aqui no fórum mesmo) , se conseguir, é porque não existe instância de seu programa rodando, se não conseguir, é porque há instância e aí você mata a execução.

Até!

beleza, vou pesquisar um pouco sobre essa API de arquivo blocante, ja que nem imagino do que se trata.

Valew pela ajuda.

A API IO padrão do java já é blocante. Se usares NIO não vai funcionar.
Só falei para você procurar porque muitos pedem essa parte já pronta.

Até!

implementei usando o pacote java.nio.channels.FileLock; e está funcionando perfeito.

Valew

Eu usava File comum. Não sou muito fã de NIO para isso.

Até!