【问题标题】:maven add project's jar lib to executable jarmaven将项目jar库添加到可执行jar
【发布时间】:2014-04-07 03:59:29
【问题描述】:

我有一个项目,在项目的子目录(我将其称为 myLib)中包含所需的 lib(jar 文件)。我想使用 maven 将项目构建为可执行 jar,并使用来自 myLib 的依赖项以避免 ClassNotFoundException。我打算做的是使用 maven-shade-plugin;但是,myLib 中的大多数依赖项都不在 maven 存储库中,所以我不确定是否可以在不将 myLib 的 jar 安装在 maven 存储库中的情况下执行此操作:

    <artifactSet>
        <include>groupId:artifactId</include>
    <artifactSet>

maven 是否可以在不使用 mvn install:install 将它们安装到 maven 存储库的情况下将这些“myLib 依赖项”包含到打包的可执行 jar 中?

我还尝试通过将 myLibs jar 移动到 src/main/resources/ 中来添加它们,以便将它们添加到可执行 jar 文件中,但我无法通过将它们添加到我的清单的 Class-Path 标头中来引用它们docs.oracle.com/javase/tutorial/deployment/jar/downman.html 中提到的文件。

 

【问题讨论】:

    标签: java maven jar dependencies executable-jar


    【解决方案1】:

    您不能只在您的 jar 中包含 3rd 方 jar。清单中的类路径与您正在运行的 jar 相关。

    例如,如果您有依赖于 my-utils.jarmy-application.jar 并且两者都在同一个目录中,那么您的清单类路径将是:

    Class-Path: my-utils.jar
    

    如果你只是将 my-utils.jar 移动到 lib 目录,我会得到这样的布局:

    + my-application.jar
    + lib
      + my-utils.jar
    

    您的清单类路径将是:

    Class-Path: lib/my-utils.jar  
    

    现在解决您的问题。

    首先,您应该真正将所有库放入存储库。 Maven 是为从存储库工作而构建的,违反“Maven 方式”通常会导致以后出现问题。

    另一种方法(我不推荐)是使用system 范围声明依赖关系,它允许您指定路径,例如:

    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>my-utils</artifactId>
      <version>1.0</version>
      <scope>system</scope>
      <systemPath>lib/my-utils.jar</systemPath>
    </dependency>
    

    但是,请谨慎使用。 system 范围旨在与系统 jar 一起使用,通常是 JVM 中的那些。将它与其他任何东西一起使用实际上是对该功能的滥用,并且可能会影响您构建的可移植性。

    一旦你有你的依赖,你需要打包你的应用程序。正如我所提到的,在您的应用程序 jar 中包含依赖项 jar 将不起作用。我通常使用Assembly Plugin,它允许我创建一个压缩包,可以简单地解压缩以安装应用程序。

    Assembly Plugin 来自一个简单的描述符,在您想要包含应用程序 jar 和依赖项 jar 的情况下,它看起来像这样:

    <?xml version="1.0"?>
    
    <assembly
      xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"
    >
    
      <id>${project.name}</id>
    
      <formats>
        <format>zip</format>
        <format>dir</format>
      </formats>
    
      <includeBaseDirectory>false</includeBaseDirectory>
    
      <dependencySet>
        <outputDirectory>lib</outputDirectory>
        <useProjectArtifact>true</useProjectArtifact>
        <includes>
          <include>${artifact.groupId}:${artifact.artifactId}</include>
        </includes>
      </dependencySet>
    
      <dependencySet>
        <outputDirectory>lib</outputDirectory>
        <useProjectArtifact>false</useProjectArtifact>
      </dependencySet>
    
    </assembly>
    

    (您可能需要稍微玩一下include

    您还可以包含运行应用程序的脚本和程序集中所需的属性。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      相关资源
      最近更新 更多