Detecte se um determinado software está instalado na máquina de um usuário em java

StackOverflow https://stackoverflow.com/questions/1354186

  •  20-09-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo Java que requer determinado software (um deles sendo Perl) antes que ele possa ser executado. O que eu costumava fazer para detectar para Perl é:

Runtime.getRuntime().exec("perl Test.pl");

E se houve uma ioexception declarar que não havia perl.

No entanto, um dos meus usuários reclamou que o aplicativo continuava falhando porque ele não havia colocado Perl em seu caminho varível. Então é por isso que estou perguntando: existe alguma maneira de operação cruzada de detectar se o Perl (ou qualquer outro software) está instalado no sistema do usuário e o caminho para o programa?

Foi útil?

Solução

Não conheço seu público -alvo (usuários), mas, após o fracasso, você pode levar o usuário a entrar no caminho (um FileChooserDialog) e, em seguida, armazenar esse caminho para uso futuro (se a exceção não for lançada novamente). Fiz isso há algum tempo, felizmente eu tinha usuários que eram sysadmins, por isso não foi bom fornecer essas informações quando o erro aconteceu pela primeira vez (também documentei como atualizar ou alterar esses valores em um arquivo de propriedades).

Outra opção mencionada pela DON é instalar o software necessário como em relação à sua instalação, essa é uma opção mais comum.

Outras dicas

Esse tipo de pergunta parece estar surgindo de vez em quando e a resposta (quase) sempre é não. O motivo mais geral da resposta negativa é que o Java é executado em um ambiente de máquina virtual homogêneo, que é projetar o mesmo em todas as plataformas; Essas operações que você não pode abstrair/fazer de maneira confiável em pelo menos as plataformas mais suportadas simplesmente não podem ser feitas facilmente. Detectar eventos externos no sistema operacional em geral, como os que não são aplicativos que não são de Java também são executados/instalados na categoria "não fácil de fazer".

Certamente poderia haver necessidade/mercado para bibliotecas JNI para esse fim, mas aqueles que dirigem fortemente do plataforma cruzada Requisito essas perguntas sempre parecem querer e é por isso que a resposta curta é "não". Tanto quanto eu posso ver, o que você está fazendo atualmente é a maneira mais limpa de detectar Perl, a menos que você esteja disposto a incluir perljvm ou similar em seu projeto.

Se o usuário não estiver disposto a também

  • Instale o Perl em um local acordado
  • Indique onde o Perl foi instalado armazenando sua localização em uma variável de ambiente, arquivo de configuração, registro do Windows etc.

Parece que sua única opção é pesquisar o disco inteiro por um executável chamado 'Perl'. Obviamente, isso pode levar muito tempo, mas se você armazenar o local em algum lugar, pelo menos precisará procurá -lo uma vez

Obter informações nativas do Windows usando o Java SDK não é possível sem o suporte a APIs externas. Em vez de usar APIs externas (que é principalmente licenciado LGPL e não completamente aberto), podemos usar os comandos do shell para obter o mesmo.

Etapa 1 - Verificando se (perl) um aplicativo for instalado

Para verificar se um aplicativo for instalado, use ProcessBuilder ou RunTime.exec para executar um dos seguintes comando do PowerShell,

Get-ItemProperty HKLM: Software Microsoft Windows CurrentVersion Uninstall* | Select-object DisplayName | onde {$ _. DisplayName -Match "Perl"}

Substitua "Perl" por sua escolha de software e transmita a saída destes e processe -o.

Se Perl (para a pergunta acima), siga abaixo de 2 etapas para definir o caminho e executar o script Perl de Java

Etapa 2 - Se disponível, defina -o para o caminho do ambiente usando o código Java.

Etapa 3 - Execute seu script Perl.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top