【问题标题】:Maven executable jar with libraries on external pathMaven 可执行 jar 与外部路径上的库
【发布时间】:2011-07-30 01:48:06
【问题描述】:

我的 jar 没有运行,我可以告诉它尝试运行,因为 log4j 文件设法创建日志文件夹,但是没有任何反应并且日志为空白。

我的问题是我的 jar 文件位于名为 bin 的文件夹中,而库位于名为 lib 的文件夹中

我正在尝试这个:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
    <outputDirectory>${staging.dir}/bin</outputDirectory>
      <archive>
        <manifest>
          <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
          <addClasspath>true</addClasspath>
          <mainClass>com.Main</mainClass>
          <classpathPrefix>../lib/</classpathPrefix>
        </manifest>
      </archive>
    </configuration>
  </plugin>

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${staging.dir}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

我也尝试过使用 maven-assembly-plugin,但它将所有东西都打包在 jar 中,我真的需要文件夹 bin 和 lib

我需要进行哪些设置才能使其正常工作?

编辑:META-INF 文件

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: me
Build-Jdk: 1.6.0_26
Main-Class: com.Main
Class-Path: ../lib/ojdbc6-11.2.0.jar ../lib/sqljdbc4-4.2.0.jar ../lib/
mysql-connector-java-5.1.17.jar ../lib/hibernate-core-3.6.5.Final.jar
../lib/antlr-2.7.6.jar ../lib/commons-collections-3.1.jar ../lib/dom
4j-1.6.1.jar ../lib/hibernate-commons-annotations-3.2.0.Final.jar ../
lib/hibernate-jpa-2.0-api-1.0.0.Final.jar ../lib/jta-1.1.jar ../lib/s
lf4j-api-1.6.1.jar ../lib/hibernate-entitymanager-3.6.5.Final.jar ../
lib/cglib-2.2.jar ../lib/asm-3.1.jar ../lib/javassist-3.12.0.GA.jar .
./lib/slf4j-log4j12-1.6.1.jar ../lib/log4j-1.2.16.jar ../lib/commons-
codec-1.5.jar ../lib/lablib-checkboxtree-3.3-20110114.141734-3.jar

解决方案

原来 META-INF 文件不正确。原因是 maven-archiver-plugin 将带有时间戳的 SNAPSHOT 库重命名为默认行为

按照 Maven Archiver 文档的说明覆盖使用此功能:

<plugins>
  <plugin>
     <artifactId>maven-war-plugin</artifactId>
     <configuration>
       <archive>
         <manifest>
           <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
          <addClasspath>true</addClasspath>
          <useUniqueVersions>false</useUniqueVersions>
          <mainClass>com.Main</mainClass>
          <classpathPrefix>../lib/</classpathPrefix>
         </manifest>
       </archive>
     </configuration>
  </plugin>
</plugins>

除此之外,我希望人们在开始时发现 maven 代码很有用,因为它确实有效,只是要注意项目中的 SNAPSHOTS

【问题讨论】:

  • 您的清单文件看起来如何?您实际上是否将依赖的 jar 放在 lib 文件夹中?
  • 一切都在那里,清单看起来不错,现在只是附加到编辑
  • 你说得对,是 META-INF 问题,我的最后一个库是 lablib-checkboxtree-3.3-SNAPSHOT.jar,尝试在控制台上运行 jar,但找不到库。我尝试删除并重新下载该库,但它一直放置 thtat numebr 而不是单词 SNAPSHOT,为什么?
  • 是的,“useUniqueVersions”是解决你命名的“时间戳”问题的方法,我遇到了类似的问题。

标签: maven jar


【解决方案1】:

以上一切看起来都还可以。以下是您可能想尝试/确认/回答的一些事情/问题:

  • 您是从命令行运行它吗? IE。使用java -jar &lt;your.jar&gt; 或者你正在启动它,例如通过双击文件等?如果没有,请尝试从命令行运行它,看看会发生什么
  • 尝试使用mvn exec:java 来查看是否可以正常启动您的应用程序(maven-)。如果您不熟悉 exec 插件,请参阅http://mojo.codehaus.org/exec-maven-plugin/usage.html
  • 您能否使用常规 Java System.out.println 而不是记录来确认它确实启动了?拥有零大小的日志可能是日志配置问题
  • 我看到你上面有一些数据库库。您能否围绕基本初始化放置一些 println (或更好的日志记录,但只有在您确认您的日志记录确实有效之后)语句,以确认您不只是停在那里(前提是正在发生的事情 - 您没有提及任何异常或其他问题具体)

很大程度上取决于实际的应用程序代码,但希望以上内容可以帮助您查明问题。

顺便说一句,你的主班真的是com.Main吗?如果是,我可以建议将其更改为更合适的内容 - 例如com.yourdomain.yourapp.Main 或类似的东西。并不是说这会改变上述结果,只是一种风格上的评论。

【讨论】:

  • 我双击它,因此我没有看到任何错误,现在我使用控制台我看到它无法加载最后一个库,名称应该是 lablib-checkboxtree-3.3- SNAPSHOT,但是 maven 将其更改为那个 lablib-checkboxtree-3.3-20110114.141734-3,我手动更改了 lib 名称并确认它有效,如何更正此问题?
  • 别担心名字不是 com.Main ;)
  • 您能否尝试从您的.m2 文件夹中删除工件(如果您不熟悉,请参阅此:*.com/questions/6081617/missing-maven-m2-folder)然后再次尝试mvn package?您应该在 .m2/repository//lablib-checkboxtree/3.3-SNAPSHOT 中找到它 - 只需将该文件夹移动到其他位置(作为备份解决方案),然后重新安装它,但是您之前所做的(您是否使用 mvn install:install-file 或你有类似 Nexus 的网站吗?)。您应该确认那里有 lablib-checkboxtree-3.3-SNAPSHOT.jar
  • > 并且不用担心名称不是 com.Main ;) 酷 :)
  • 或者最好将其部署为非快照版本 - 如果你能做到会更好(例如*.com/questions/758921/…
最近更新 更多