2009-08-21 11 views
18

Quelle est la meilleure façon de créer une application java qui peut être exécutée en utilisant 'service' sous Linux? J'allais utiliser le JSW disponible here, mais je ne peux pas utiliser la licence sur cela (la licence est soit GPL ou cela coûte de l'argent autant que je peux dire). J'aurais besoin d'une licence de style apache. J'utilise maven pour construire, donc ce serait génial s'il était possible de créer le service en utilisant un plugin maven, mais toute autre suggestion serait géniale.Outil pour créer un service démon Java sous Linux

J'ai vu Apache Commons Daemon, y at-il un plugin maven pour cela? La documentation semble clairsemée, donc un exemple concret de ce serait bien ...

Merci

Répondre

20

Services sur Linux ne sont que des scripts shell qui lancent des processus d'arrière-plan. Jetez un oeil dans /etc/init.d - vous pouvez ouvrir les fichiers dans un éditeur de texte. Tout ce dont vous avez besoin est un script bash qui répond aux paramètres start et stop d'une manière appropriée (par exemple start va démarrer votre service et enregistrer l'ID de processus dans un emplacement connu, stop va tuer le processus avec le PID du fichier que vous avez créé), puis placez-le dans /etc/init.d.

Jetez un oeil à Init Scripts et An introduction to services, runlevels, and rc.d scripts

13

Pour autant que je sais qu'il n'y a pas un plugin Maven soit pour Daemon Apache ou Akuma. Bien que vous puissiez tenter de les invoquer depuis une build Maven en utilisant le maven-exec-plugin.


En ce qui concerne vos entreprises des réserves quant à l'utilisation de produits sous licence GPL, il vaut la peine de lire sur les conséquences de l'utilisation. Ce n'est pas aussi virulent que les entreprises craignent. Voici un interpretation of the GPL. Bien entendu, cela n'a aucun poids juridique (et peut ne pas être correct ou soutenu par un précédent, je ne suis pas un avocat), mais pourrait suffire à vous permettre d'engager une conversation avec votre personnel juridique.

De la page référencée:

combinant simplement une œuvre protégée avec un autre travail ne crée pas une œuvre dérivée. L'œuvre originale protégée par des droits d'auteur doit être modifiée d'une manière ou d'une autre. Le travail dérivé qui en résulte doit lui-même "représenter un travail d'auteur original". Ainsi, si le détenteur de licence ne modifie pas le programme original sous licence GPL, mais l'exécute simplement, il ne crée pas de travail dérivé.


Il est le Appassembler Maven plugin que je pense ne que vous avez besoin (même si elle ne crée wrappers JSW). Il crée un script shell (et un fichier bat) et collecte tous les fichiers jar de l'application dans un répertoire. Il peut éventuellement être configured pour créer des configurations Daemon JSW.

Voici un exemple de configuration qui générera l'application autonome dans le dossier cible/appassembler et génèrera les fichiers d'encapsulation JSW dans le répertoire target/appassembler/jsw/myApp. Notez que l'objectif d'assemblage est lié à la phase de test d'intégration pour garantir la création du fichier jar du projet. Pour générer la course de sortie mvn vérifier ou simplement générer les enveloppes de services exécuter mvn package:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>appassembler-maven-plugin</artifactId> 
    <version>1.0</version> 
    <executions> 
     <execution> 
     <id>assemble-standalone</id> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>assemble</goal> 
     </goals> 
     <configuration> 
      <programs> 
      <program> 
       <mainClass>name.seller.rich.MyMainClass</mainClass> 
       <name>myShellScript</name> 
      </program> 
      </programs> 
      <platforms> 
      <platform>windows</platform> 
      <platform>unix</platform> 
      </platforms> 
      <!--collect all jars into the lib directory--> 
      <repositoryLayout>flat</repositoryLayout> 
      <repositoryName>lib</repositoryName> 
     </configuration> 
     </execution> 
     <execution> 
     <id>generate-jsw-scripts</id> 
     <phase>package</phase> 
     <goals> 
      <goal>generate-daemons</goal> 
     </goals> 
     <configuration> 
      <!--declare the JSW config --> 
      <daemons> 
      <daemon> 
       <id>myApp</id> 
       <mainClass>name.seller.rich.MyMainClass</mainClass> 
       <commandLineArguments> 
       <commandLineArgument>start</commandLineArgument> 
       </commandLineArguments> 
       <platforms> 
       <platform>jsw</platform> 
       </platforms>    
      </daemon> 
      </daemons> 
      <target>${project.build.directory}/appassembler</target> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Pour référence, les fichiers générés sont les suivants:

myApp\bin\myApp 
myApp\bin\myApp.bat 
myApp\bin\wrapper-linux-x86-32 
myApp\bin\wrapper-macosx-universal-32 
myApp\bin\wrapper-solaris-x86-32 
myApp\bin\wrapper-windows-x86-32.exe 
myApp\conf\wrapper.conf 
myApp\lib\libwrapper-linux-x86-32.so 
myApp\lib\libwrapper-macosx-universal-32.jnilib 
myApp\lib\libwrapper-solaris-x86-32.so 
myApp\lib\wrapper-windows-x86-32.dll 
myApp\lib\wrapper.jar 
+0

@ Rich - merci pour la répondre. J'avais initialement fait quelque chose comme ça, mais la licence de JSW est trop restrictive pour moi (enfin mon employeur!). Par ailleurs, est-il possible de configurer Appassembler à partir du projet principal POM sur un projet avec plusieurs modules? La seule façon de le faire était de créer un nouveau module avec le travail spécifique de créer les scripts de service (et RPM dans mon cas) qui ont fonctionné après que tous les autres modules ont été empaquetés ... – Lehane

+0

Si vous exécutez l'assemblage but sur le module qui dépend de tous les autres, ces dépendances seront empaquetées dans le répertoire appassembler. Donc, il ne serait probablement pas exécuté sur votre pom agrégateur, mais sur le module avec la classe "principale" –

+0

aussi la licence GPL n'est pas aussi restrictive que les sociétés ont tendance à le croire. Avoir une lecture de ceci: http://www.sitepoint.com/article/public-license-explained/ –

Questions connexes