Scripts para executar programas Java - por exemplo, Formiga

5

Atualmente, minha equipe usa um script Ant para executar vários programas Java.

Note que não estou perguntando sobre como gerenciar o ciclo de construção / implantação para o qual já estamos usando o Maven (muito feliz).

Por exemplo, usamos algo como o seguinte:

<path id="lib">
  <fileset dir="path/to/lib" />
</path>

<path id="run" >
  <path refid="lib" />
</path>

<target name="aJavaProgram" >
  <java classname="path.to.AJavaProgam" 
        classpathref="run" fork="yes" failonerror="false" append="true" />
</target>

<target name="anotherJavaProgram" depends="aJavaProgram" >
  <java classname="path.to.AnotherJavaProgam" 
        classpathref="run" fork="yes" failonerror="false" append="true" />
</target>

Originalmente escolhemos o Ant pelas seguintes razões (ou melhor, eu não escolhi o Ant, foi assim quando entrei, mas acho que essas são boas razões para a escolha):

  • era uma maneira fácil de gerenciar dependências (apesar de agora as pegarmos no Maven)
  • nos permite criar / manter dependências facilmente entre tarefas específicas
  • podemos implantar o script Ant e as bibliotecas Java e executar facilmente tarefas específicas - por exemplo,
    • não precisamos nos preocupar com os classpaths (configurados no script Ant)
    • não precisamos nos preocupar com a criação de jars com as principais classes especificadas no manifesto
    • podemos usar o Ant para criar / armazenar / gerenciar argumentos passados para os métodos main ()
  • podemos conectar esses scripts ant em nossos IDEs e executar os trabalhos de lá.

De um modo geral, estamos muito felizes com isso.

No entanto, um problema crescente é o Problema do gancho ant-java-shutdown - isso significa que, se um desses programas Java falhar, mas não terminar, encerrar o processo Ant a partir do qual ele foi iniciado não encerrará o processo Java - que, então, deve ser feito manualmente, e é uma ligação real.

Além disso, estou consciente de dois outros fatores (possíveis):

Então, para esclarecer:

  • Eu quero uma abordagem flexível para executar vários programas Java
  • a abordagem que estamos usando foi fazer isso via scripts Ant, mas isso teve os seguintes problemas:
    • encerrar a tarefa Ant não mata o programa Java
    • isso "sente" como Ant não é a ferramenta certa para o trabalho
  • como podemos atender às necessidades especificadas acima?
    • se não for Ant, a solução não deve enfrentar o problema do gancho de encerramento / encerramento
por amaidment 29.11.2013 / 11:41
fonte

5 respostas

2

Parece que você está executando alguns programas Java em uma sequência e basicamente você estava usando Ant para chamar java como java -jar myApplication.jar ...

Normalmente, vejo isso usando scripts de shell. Eles são simples, pequenos e muito bons para redirecionar a saída para arquivos, outros programas, etc ...

Se você quiser algo que seja compatível com plataformas cruzadas, você pode usar uma linguagem de script como Perl ou Ruby ou Python, todos eles permitem que você chame java -jar myApplication.jar e pode ser tão simples quanto 1 ou 2 linhas para executar seu programa Java. Existem versões de todas estas disponíveis para Windows, OS X, Linux e Unix. E você obtém a flexibilidade total desses idiomas, caso precise deles.

Além disso, a maioria dos IDEs suporta o lançamento de ferramentas "externas" / "de terceiros" de dentro do IDE, para que você possa escrever um script shell (ou Perl ou qualquer outro) para iniciar seus programas Java e, em seu IDE, ser possível criar um link / botão / qualquer coisa para lançar myJavaAppRunner.ksh com o clique de um botão.

    
por 08.07.2014 / 22:02
fonte
0

Em um mundo perfeito, desligar seu programa Ant também encerraria seus programas Java. Parece que você precisa de um procedimento explícito de desligamento.

O Ant é ótimo para escrever scripts independentes de plataforma. Eu nunca ouvi falar de um processo Ant de longa duração antes. Na minha experiência, o programa Ant é executado, faz seu trabalho e sai. Sugiro configurar spawn=true quando você iniciar os programas Java para que eles continuem depois que Ant falecer, permitindo que Ant saia o mais rápido possível.

Você deve fazer uma tarefa Ant explícita cujo trabalho é desligar o sistema. A maneira rápida e suja é encontrar esses programas Java e matá-los. Supondo que esses sejam os programas que você escreveu, você poderá incorporar ganchos de desligamento explícitos. Por exemplo, cada programa escuta em uma porta predefinida e quando alguém se conecta a essa porta e emite as instruções corretas, o programa iniciará um desligamento normal.

Esta sugestão vem com riscos de segurança - e se um programa malicioso iniciar a seqüência de desligamento? Você terá que certificar-se de que seu firewall esteja configurado adequadamente para que apenas processos confiáveis ou máquinas possam acessar a porta de desligamento. Essa parte é deixada como um exercício para o leitor. :)

Editar: Certifique-se de que sua tarefa Ant e / ou o programa Java faça a verificação de erros apropriada em quaisquer parâmetros transmitidos. Caso contrário, você pode ter uma situação realmente desafiadora para depuração. (Graças a @randomA)

    
por 04.07.2014 / 21:39
fonte
0

Duas opções que usei no meu último projeto:

  • plugin de montagem de maven: este plugin pode gerar para você um "pacote" que contém as bibliotecas que você precisa e um script de shell gerado para executar o programa. Outra opção que eu gosto muito é gerar um "jarro de gordura" com todas as bibliotecas fundidas em um grande .jar. Isso simplifica muito a distribuição e execução de programas java e você pode executar com java <class_name> -jar <ftr-jar.jar>

  • Use groovy: Eu gosto muito dessa opção porque me dá muita liberdade. Você pode ter um script .groovy que simplesmente chama suas classes. Dentro desses scripts você pode usar "grab" para declarar suas dependências (mais informações neste link: link ).

por 05.07.2014 / 04:15
fonte
0

Já que você já está usando o Maven, você pode considerar dar um Exec Plugin .

Eu preferiria evitar scripts de execução customizados se eu fosse você, a menos que a lógica de inicialização e desligamento seja realmente complexa, já que gravá-los corretamente pode ser muito mais difícil do que parece, e você pode ter problemas com multiplataformas ou até mesmo cross- compatibilidade de máquinas.

Se você precisar de muita lógica personalizada no processo de criação ou execução, mas preferir ficar dentro dos limites de um sistema de compilação, convém dar uma olhada em Gradle , que permite mais personalização do que o Maven, em alguns casos, já que você pode adicionar praticamente qualquer código do Groovy ao seu processo de criação. Essa abordagem permite uma melhor integração e pode ser mais portável do que escrever scripts personalizados independentemente do sistema de compilação.

    
por 08.07.2014 / 23:24
fonte
-1

A maioria das ferramentas Java maiores, como o Maven e o Ant, têm wrappers de script batch / shell.

Então, se você quer ser multiplataforma, precisa ter os dois. O link tenta automatizar a criação desses scripts para você tanto no Windows quanto no Unix .

    
por 29.04.2017 / 15:55
fonte

Tags