Script per eseguire programmi Java - ad es. Formica

5

Il mio team usa attualmente uno script Ant per eseguire vari programmi Java.

Si noti che non sto chiedendo di gestire il ciclo di build / deployment per il quale stiamo già utilizzando Maven (abbastanza felicemente).

Ad esempio, usiamo qualcosa di simile al seguente:

<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>

Inizialmente abbiamo scelto Ant per i seguenti motivi (o meglio non ho scelto Ant, era così quando sono entrato, ma penso che questi siano buoni motivi per scegliere):

  • era un modo semplice per gestire le dipendenze (anche se ora le prendiamo da Maven)
  • ci consente di costruire / mantenere facilmente le dipendenze tra particolari lavori
  • possiamo distribuire lo script Ant e le librerie Java e facilmente eseguire determinati lavori, ad es.
    • non dobbiamo preoccuparci di classpaths (configurati nello script Ant)
    • non dobbiamo preoccuparci di costruire i jar con le classi principali specificate nel manifest
    • possiamo usare Ant per creare / archiviare / gestire gli argomenti passati ai metodi main ()
  • possiamo collegare questi script di formica ai nostri IDE ed eseguire i lavori da lì.

In generale, siamo stati molto contenti di questo.

Tuttavia, un problema crescente è ant-java-shutdown hook issue - questo significa che se uno di questi programmi Java fallisce ma non termina, terminare il processo Ant da cui è stato avviato non termina il processo Java - che poi deve essere fatto manualmente, ed è un vero bind.

Inoltre, sono consapevole di altri due (possibili) fattori:

Quindi, per chiarire:

  • Voglio un approccio flessibile per l'esecuzione di vari programmi Java
  • l'approccio che stavamo usando era quello di farlo tramite gli script di Ant, ma questo aveva i seguenti problemi:
    • terminare l'attività Ant non uccide il programma Java
    • questo "sente" come Ant non è lo strumento giusto per il lavoro
  • come possiamo soddisfare le esigenze sopra specificate?
    • se non Ant, la soluzione non deve affrontare il problema dell'arresto di terminazione / spegnimento
posta amaidment 29.11.2013 - 11:41
fonte

5 risposte

2

Sembra che tu stia eseguendo alcuni programmi Java in una sequenza e in pratica stai usando Ant per chiamare java come java -jar myApplication.jar ...

Normalmente, vedo questo fatto usando gli script di shell. Sono semplici, piccoli e molto utili per reindirizzare l'output su file, altri programmi, ecc ...

Se vuoi qualcosa che sia più compatibile multipiattaforma, puoi usare un linguaggio di scripting come Perl o Ruby o Python, tutti ti permettono di chiamare java -jar myApplication.jar e potrebbe essere semplice come 1 o 2 linee per eseguire il tuo programma Java. Ci sono versioni di tutti questi che sono disponibili per Windows, OS X, Linux e Unix. E ottieni la massima flessibilità di questi linguaggi, se ne hai realmente bisogno.

Inoltre, la maggior parte degli IDE supportano l'avvio di strumenti "esterni" / "di terze parti" all'interno dell'IDE, così puoi scrivere uno script shell (o Perl o qualsiasi altro) per avviare i tuoi programmi Java, e poi nel tuo IDE, dovrebbe essere possibile creare un link / pulsante / qualsiasi cosa per lanciare myJavaAppRunner.ksh con un clic di un pulsante.

    
risposta data 08.07.2014 - 22:02
fonte
0

In un mondo perfetto, chiudere il tuo programma Ant chiuderebbe anche i tuoi programmi Java. Sembra che tu abbia bisogno di una procedura di arresto esplicito.

Ant è ottimo per scrivere script indipendenti dalla piattaforma. Non ho mai sentito parlare di un processo Ant da molto tempo prima. Nella mia esperienza il programma Ant funziona, fa il suo lavoro ed esce. Ti suggerisco di impostare spawn=true quando accendi i programmi Java in modo che continuino dopo la morte di Ant, consentendo quindi a Ant di uscire il più rapidamente possibile.

Dovresti creare un compito Ant esplicito il cui compito è quello di spegnere il sistema. Il modo rapido e sporco è trovare quei programmi Java e ucciderli. Supponendo che si tratti di programmi che hai scritto, sarai in grado di incorporare hookdown espliciti. Ad esempio, ogni programma ascolta su una porta predefinita e quando qualcuno si connette a quella porta e invia le giuste istruzioni il programma avvierà un arresto regolare.

Questo suggerimento viene fornito con i rischi per la sicurezza: cosa succede se un programma dannoso avvia la sequenza di spegnimento? Dovrai assicurarti che il tuo firewall sia configurato in modo appropriato in modo che solo i processi o le macchine affidabili possano accedere alla porta di spegnimento. Quella parte è lasciata come esercizio per il lettore. :)

Modifica: assicurati che l'attività Ant e / o il programma Java eseguano il controllo degli errori appropriato su tutti i parametri che vengono inoltrati. In caso contrario, potresti avere una situazione davvero difficile da eseguire il debug. (Grazie a @randomA)

    
risposta data 04.07.2014 - 21:39
fonte
0

Due opzioni che ho usato nel mio ultimo progetto:

  • plugin assembly maven: questo plugin può generare per te un "pacchetto" che contiene le librerie necessarie e uno script di shell generato per eseguire il programma. Un'altra opzione che mi piace molto è generare un "vaso grasso" con tutte le librerie unite in un grande .jar. Questo semplifica molto la distribuzione e l'esecuzione di programmi java e puoi eseguire semplicemente con java <class_name> -jar <ftr-jar.jar>

  • Usa groovy: mi piace molto questa opzione perché mi dà molta libertà. Puoi avere uno script .groovy che chiama semplicemente le tue classi. All'interno di questo script puoi usare "afferrare" per dichiarare le tue dipendenze (maggiori informazioni in questo link: link ).

risposta data 05.07.2014 - 04:15
fonte
0

Dato che stai già utilizzando Maven, potresti prendere in considerazione di dare il plugin Exec un colpo.

Preferirei evitare script di run personalizzati se fossi in te, a meno che la logica di avvio e spegnimento sia davvero complessa, dal momento che scriverli correttamente potrebbe essere molto più difficile di quanto sembri, e puoi affrontare problemi con cross-platform o persino cross-platform compatibilità della macchina.

Se hai bisogno di molta logica personalizzata nel processo di generazione o esecuzione ma preferisci rimanere entro i limiti di un sistema di generazione, potresti dare un'occhiata a Gradle che ti consente una maggiore personalizzazione rispetto a Maven in alcuni casi poiché puoi aggiungere quasi tutti i codici di Groovy al tuo processo di compilazione. Questo approccio consente una migliore integrazione e può essere più portatile della scrittura di script personalizzati indipendentemente dal sistema di compilazione.

    
risposta data 08.07.2014 - 23:24
fonte
-1

La maggior parte degli strumenti java più grandi come Maven e Ant hanno wrapper di script batch / shell.

Quindi, se vuoi essere multipiattaforma, devi averli entrambi. link cerca di automatizzare la creazione di quegli script per te sia per Windows che per Unix .

    
risposta data 29.04.2017 - 15:55
fonte

Leggi altre domande sui tag