我正在尝试编写的服务有问题。我正在尝试创建一个在Windows系统后台运行但使用java的服务。我已经看到了几种方法,但决定了一种似乎符合我要求的方法。该服务将检查数据库中是否需要处理的项目。当它在DB中找到它需要做的项时,它将运行一些系统命令来处理它们。
我找到了一种方法来使用tomcat7.exe文件来运行jar作为服务,这对于基本的东西非常有效。我编写并编译到我的jar文件“myService.jar”中的任何内容我们都可以调用它。问题是我们已经编写了几个类来访问DB并运行在名为BGLib-1.0.jar的类库中预编译的命令。
我已经使用这个库编写了几个jenkins插件,并且从它调用函数没有任何问题。当我创建一个hpi文件并将其部署在Jenkins中时,它们都可以正常工作。在那里,编译器(使用Maven的Eclipse)将BGLib jar打包到插件jar中,Jenkins想出了如何让他们看到彼此。
但是,当我构建我的服务jar时,它在部署它时不起作用。
我运行这样的命令将Tomcat exe重命名安装到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
当我在myService.jar中使用代码部署它时,服务按预期运行,但是当我尝试在BGLib-1.0.jar中调用函数时,我什么也得不到。 jvm似乎崩溃或没有响应。调试有点棘手,但看起来我没有找到类错误。
我尝试在POM文件中添加以下条目,以查看更改清单中的类路径条目是否有帮助,但它没有更改清单。我仍然对清单文件的工作方式毫无头绪。关于这方面的任何文件都很酷。我去过Maven的网站,似乎没有关于可用标签的全面文档。我需要在清单中更改一些东西才能让我的jar看到外部类吗?或者我可以添加一些东西,让Maven用我的jar编译那个jar中的类?
提前感谢。
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.myCompany.myService.myService</mainClass>
<customClasspathLayout>BGLib-1.0.jar</customClasspathLayout>
</manifest>
</archive>
</configuration>
答案 0 :(得分:0)
要主要回答标题问题,您可以shade plugin将依赖项包含在最终的jar中。您甚至可以在最终jar中重新定位类文件(例如更改包名称),以便包含的类不会与类路径上的着色依赖项的不同版本冲突。不确定这是否是针对您的特定问题的最佳解决方案。
答案 1 :(得分:0)
您可以使用maven-dependency-plugin unpack-dependencies goal在生成的工件中包含依赖项的内容。
如何执行此操作的示例如下:
<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>
这将扩展protobuf-java依赖项(展平它)并将内容包含在构建生成的结果工件中。
答案 2 :(得分:0)
在我看来你确实想要使用appassembler-maven-plugin,否则我会选择maven-shade-plugin。