带有外部路径库的 Maven 可执行 jar

标签 maven jar

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

我的问题是我在名为 bin 的文件夹中有 jar 文件,在名为 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 doc 的指示使用它来覆盖它:
<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 代码很有用,因为它确实有效,只是要注意项目中的快照

最佳答案

以上一切似乎都可以。以下是您可能想要尝试/确认/回答的一些事情/问题:

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

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

    作为旁注,你的主类真的是com.Main ?如果是,我是否可以建议将其更改为更合适的内容 - 例如com.yourdomain.yourapp.Main或类似的东西。并不是说这会改变上述结果,只是一种文体评论。

    关于带有外部路径库的 Maven 可执行 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880573/

    相关文章:

    jakarta-ee - 仅在 WEB-INF/classes 文件夹中保留 .class 和 .properties 文件

    java - Spring Boot FlywayException : Unable to connect to the database. 配置url、用户和密码

    spring-boot - Spring Boot 插件不会在 jar 中添加 lib 文件夹

    java - 尝试启动 osgi 包时发生 BundleException

    java - javax.servlet-api.jar 与 servlet-api.jar 之间的区别

    java - 从 3.0.0 升级后无法运行 Gxt 3.1.1 应用程序

    java - 将字符串保存在 java 文件中以供以后运行 jar?试图制作一个字符串来告诉我的 jar 它是否被激活

    Java - Netbeans 的 .jar 意外问题

    java - 通过 jython 在 java 类中使用 jar

    java - 为单个测试用例生成 JUnit 报告