【问题标题】:How to include external classes in my jar如何在我的 jar 中包含外部类
【发布时间】:2013-02-14 15:18:34
【问题描述】:

我尝试编写的服务有问题。我正在尝试创建一个在 Windows 系统的后台运行但使用 java 的服务。我已经看到了几种方法,但决定采用一种似乎符合我要求的方法。该服务将检查数据库中需要处理的项目。当它在数据库中找到需要执行的项目时,它将运行一些系统命令来处理它们。

我找到了一种使用 tomcat7.exe 文件将 jar 文件作为服务运行的方法,该方法对于基本内容非常有效。任何我编写并编译到我的 jar 文件“myService.jar”中的东西,我们都可以称之为它。问题是我们已经编写了几个类来访问数据库并运行预编译在名为 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 似乎崩溃或变得无响应。调试有点棘手,但看起来我遇到了 class not found 错误。

我尝试在 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>

【问题讨论】:

  • 你看过maven-assembly-plugin吗?它将允许您创建一个发行版,包括您的代码、它的依赖项、运行它的脚本等。

标签: java maven classpath pom.xml


【解决方案1】:

主要回答标题的问题,您可以shade plugin 将依赖项包含到您的最终jar 中。您甚至可以在最终 jar 中重新定位类文件(例如更改包名称),以便包含的类不会与类路径上不同版本的阴影依赖项冲突。不过,不确定这是否是您特定问题的最佳解决方案。

【讨论】:

    【解决方案2】:

    您可以使用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 依赖项(将其展平)并将内容包含在您的构建生成的结果工件中。

    【讨论】:

      【解决方案3】:

      在我看来你真的想使用appassembler-maven-plugin,否则我会选择 maven-shade-plugin。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 2013-11-07
        • 2013-08-16
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        相关资源
        最近更新 更多