如何在我的jar中包含外部类

时间:2013-02-14 15:18:34

标签: java maven classpath pom.xml

我正在尝试编写的服务有问题。我正在尝试创建一个在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>

3 个答案:

答案 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。