2013-02-14 4 views
0

J'ai un problème avec un service que j'essaie d'écrire. J'essaie de créer un service qui fonctionne en arrière-plan sur un système Windows mais utilise Java. J'ai vu plusieurs façons de le faire, mais j'ai décidé d'une méthode qui semblait répondre à mes exigences. Le service vérifiera dans une base de données les éléments sur lesquels il doit travailler. Quand il trouve un élément dans la base de données qu'il a besoin de faire, il va exécuter des commandes système pour prendre soin d'eux.Comment inclure des classes externes dans mon pot

J'ai trouvé un moyen d'utiliser le fichier tomcat7.exe pour exécuter un fichier jar en tant que service et qui fonctionnait assez bien pour les choses de base. Tout ce que j'écris et compile dans mon fichier jar "myService.jar" nous pouvons l'appeler va assez bien. Le problème est que nous avons déjà écrit plusieurs classes pour accéder à la base de données et exécuter des commandes qui sont précompilées dans une bibliothèque de classes appelée BGLib-1.0.jar.

J'ai utilisé cette bibliothèque pour écrire plusieurs plugins jenkins et je n'ai eu aucun problème pour appeler des fonctions. Ils fonctionnent tous très bien lorsque je crée un fichier hpi et le déploie dans Jenkins. Là le compilateur (Eclipse using Maven) emballe le pot de BGLib dedans avec le pot de plugin et Jenkins découvre comment les faire se voir. Lorsque je crée mon pot de service, cependant, cela ne fonctionne pas lorsque je le déploie.

J'exécuter une commande comme celui-ci pour installer le exe Tomcat renomme MyService.exe:

d:\myService\bin>myService.exe //IS//myService --Install=D:\myService\bin\myService.exe --Description="run some commands 
Java Service" --Jvm=auto --Classpath=D:\myService\jar\myService.jar;D:\myService\jar\BGLib-1.0.jar --StartMode=jvm -- 
StartClass=com.myCompany.myService.myService --StartMethod=windowsService --StartParams=start --StopMode=jvm --StopClass 
=com.myCompany.myService.myService --StopMethod=windowsService --StopParams=stop --LogPath=D:\myService\logs --StdOutpu 
t=auto --StdError=auto 

Quand je déploie ce avec le code uniquement dans le myService.jar le service se comporte comme prévu, mais lorsque je tente pour appeler des fonctions dans le BGLib-1.0.jar je n'ai rien. Le jvm semble se bloquer ou ne plus répondre. Le débogage est un peu délicat mais il semble que je reçois des erreurs de classe non trouvées.

J'ai essayé d'ajouter l'entrée ci-dessous dans le fichier POM pour voir si changer l'entrée de chemin de classe dans le manifeste aiderait, mais il n'a pas changé le manifeste. Je suis encore une sorte d'âne ignorant comment fonctionne le fichier manifeste. Toute documentation à ce sujet serait cool. J'ai été sur le site de Maven et il ne semble pas avoir une documentation complète sur les tags disponibles. Y a-t-il quelque chose que je dois changer dans le manifeste pour que mon pot voit des classes externes? Ou y a-t-il quelque chose que je puisse ajouter qui permettra à Maven de compiler les classes de ce bocal avec mon pot?

merci d'avance.

<configuration> 
      <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>com.myCompany.myService.myService</mainClass> 
       <customClasspathLayout>BGLib-1.0.jar</customClasspathLayout> 
      </manifest> 
      </archive> 
     </configuration> 
+0

Avez-vous regardé le [maven-assembly-plugin] (http: //maven.apache.org/plugins/maven-assembly-plugin /)? Il vous permettra de créer une distribution incluant votre code, ses dépendances, les scripts pour l'exécuter, etc. – sbk

Répondre

0

Pour répondre principalement la question du titre, vous pouvez l'shade plugin d'inclure les dépendances dans votre pot final. Vous pouvez même déplacer les fichiers de classe (par exemple changer le nom du package) dans le fichier jar final afin que les classes incluses ne soient pas en conflit avec les différentes versions de la dépendance ombrée sur le classpath. Je ne sais pas si c'est la meilleure solution pour votre problème particulier.

0

Vous pouvez utiliser maven-dependency-plugin unpack-dependencies goal pour inclure le contenu d'une dépendance dans l'artefact résultant.

Un exemple de la façon de le faire serait:

 <plugin> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>${project.artifactId}-fetch-deps</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>unpack-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
         <stripVersion>true</stripVersion> 
         <excludeTransitive>true</excludeTransitive> 
         <includeArtifactIds>protobuf-java</includeArtifactIds> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Cela permettra d'élargir la dépendance protobuf-java (aplatir) et inclure le contenu dans l'artefact résultant généré par votre build.

Questions connexes