当前位置: 首页 > 知识库问答 >
问题:

maven-assembly-plugin如何包含jar文件而不是来自存储库

苗康平
2023-03-14

我需要构建一个带有依赖项的发行版jar,其中包含一个依赖项jar,由于某些原因,该jar不能放入Maven.m2/repository。在我的POM文件中我有:

<dependencies>
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>4.0</version>
    </dependency>
    <dependency>
        <groupId>com.abc.ets</groupId>
        <artifactId>mylib</artifactId>
        <version>3.0.0_258779</version>
        <scope>system</scope>
        <systemPath>${basedir}/lib/mylib_3.0.0_258779.jar</systemPath>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.abc.myapp.service.MainService</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>                
        </plugin>       
    </plugins>
</build>

构建成功,但结果myapp-1.0.0-jar-with-dependencies.jar不包含该库中的类,因此抛出ClassNotFoundException。我试图创建Assembly.xml文件来手动管理这个jar文件,但是插件文档相当粗略而且令人困惑。下面是我放入assembly.xml的内容

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
  <!-- TODO: a jarjar format would be better -->
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
      <includes>
          <include>${basedir}/lib/mylib_3.0.0_258779.jar</include>
      </includes>
    </dependencySet>
  </dependencySets>
</assembly>

当我运行构建时,我会得到

读取程序集描述符:src/assembly/assembly.xml程序集id jar-with-dependencies被多次使用。以下模式从未在此工件包含筛选器中触发:o'./lib/mylib_3.0.0_258779.jar'

结果是一样的。不包括此jar中的类。

如果有人做过类似的事情,我会很感激一些指示。

共有1个答案

羊时铭
2023-03-14

应该在运行时提供具有system作用域的依赖项。引用Maven文档:

与作用域系统的依赖关系总是可用的,并且不会在存储库中查找。它们通常用于告诉Maven JDK或VM提供的依赖关系。因此,系统依赖关系对于解决对工件的依赖关系特别有用,这些工件现在由JDK提供,但在前面的单独下载中可用。

因此,maven-assembly-plugin将不包括这些依赖项(因为预期提供了这些依赖项)。注意,如果您切换到maven-shade-plugin时,这个结果将完全相同。

解决问题的唯一方法是不要使用system作用域(您一开始就不应该使用它)。相反,将这个库安装到您的Maven repo中,然后在POM中声明它,就像您对任何正常依赖项所做的那样(更多信息请参见此答案)。

 类似资料:
  • 我使用maven和maven-jar-plugin和maven-assembly-plugin构建了项目的zip,包括项目jar及其依赖项。

  • 问题内容: 我已将JAR复制到中。 我用日食。如果我将罐子一个一个地添加到“项目”->“ Java构建路径”->“添加罐子”中,那么我会执行“项目”->“ Maven”->“更新项目配置”,它们将被Maven删除。并且Eclipse显示错误,其中包含“无法解析xxx”。 注意:我不想创建自己的Maven存储库。它只会使用一次。 我应该如何进行? 问题答案: 在公共Maven存储库中找不到所有库,例

  • Maven 的 Assembly 插件用来将项目中的依赖、模块和网站稳定等其他资源打包到一个单独的分发文件。

  • 我有一个结构如下的maven项目: 我希望maven jar插件在构建jar文件时打包到数据库文件夹中。我尝试过包含这里概述的内容:https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html,但它找不到目录“../database”(或../../database或../../../database

  • 我有一个多模块的项目,即。 在一个开发周期中,我向Module1添加了一个类。module2中的类依赖于它。 我的本地中没有这些工件。运行此: 然而,这至少从两个方面提出了一个问题: 我必须经历较慢的安装阶段,而不是较快的编译阶段 我有同一个项目的两个版本,在这些版本中有冲突的修改。我不能用它们各自的修改运行相同的Java类,只能运行当前安装的修改,考虑到它们都是相同的快照版本 这两种方法都有解决