如何使用maven shade插件向jar添加资源

2024-04-08

我的项目结构在 src/main/ 文件夹内有 resources 文件夹。 resources 文件夹包含文件server.properties。我的pom如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.fde</groupId>
    <artifactId>Listener</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Listener</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hibernate.version>3.6.10.Final</hibernate.version>
        <java.version>1.6</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- Hibernate dependencies START -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.9</version>
        </dependency>
        <!-- Hibernate dependencies END -->
    </dependencies>
    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <resources>
            <resource>
                <directory>resources</directory>
            </resource>
        </resources>
        <testSourceDirectory>src/test/java</testSourceDirectory>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.fde.ListenerServer</mainClass>
                                </transformer>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
                                    <resource>resources</resource>
                                    <file>server.properties</file>
                                </transformer>
                            </transformers>
                            <artifactSet>
                                <excludes>

                                    <exclude>junit:junit</exclude>

                                </excludes>
                            </artifactSet>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>
</project>

Jar 已正确创建,并且清单中提到了主类。我有以下问题:

  1. 目标文件夹包含包含类文件的类文件夹。罐子里也含有它们,那么为什么需要它们呢?我的目标是拥有一个仅包含所有依赖项的可执行 jar。

  2. 资源根本没有添加到 jar 中。我已经按照网上的说明添加了变压器,但没有用!

  3. 在目标文件夹中创建的其他目录是什么(maven-archiver、surefire、surefire-reports 等)?

  4. 每次我进行 Maven 全新安装时都会创建另一个 jar (original-Listener....jar)

我完全不知道如何包含资源。任何帮助表示赞赏!

EDIT:::

这是我用于 maven- assembly-plugin 的标签:

 <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>attached</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
    <archive>
            <manifest>
              <mainClass>com.fde.ListenerServer</mainClass>
            </manifest>
          </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

这将创建 Listener-1.0-SNAPSHOT-jar-with-dependency.jar,其中包含文件夹中引用的 jar 中的所有类。清单还包含主类。

问题仍然是我无法将资源包包含在文件夹 \src\main\resources 中。

另外,我无法理解为什么从我的代码引用的 jar 文件包含在 jar 中以及 META-INF 文件夹中。


问题不在于您的 maven-shade-plugin 的配置,而是您已明确将资源目录设置为错误的路径:

    <!-- wrong -->
    <resource>    
      <directory>resources</directory>
    </resource>

As <directory>element 的文档说:“描述存储资源的目录。路径是 相对于 POM."

因此,如果您遵循默认的 Maven 项目结构,则必须如下设置:

    <!-- correct -->
    <directory>src/main/resources</directory>

或者不设置它,然后它会回退到与 maven 默认值相同的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用maven shade插件向jar添加资源 的相关文章

随机推荐

  • CMake - 找不到 Boost(缺少:序列化)(找到版本“1.73.0”

    我已经在我的项目中使用 Boost 一段时间了 但到目前为止 我只使用了仅包含头文件的库 我现在想使用序列化 但是当我尝试将序列化添加为必需组件时 我收到标题中写入的错误 这是我的 CMAKE 文件 cmake minimum requir
  • 将 pandas 数据帧保存到 csv 时如何保留 numpy 数组

    我有一个pandas DataFrame其中一列作为图像 该列的每一行都是一个二维图像numpy array 我保存了DataFrame to a csv文件与pandas DataFrame to csv 然而 当我打开csv文件中 该列
  • 每 2 秒进行一次 AJAX 后调用是不是一个坏主意?

    如果我对 php 文件进行 AJAX post 调用 使用 jQuery 来更新某个参数 数字 这是否被认为是不好的做法 危险或类似的做法 post file php var var function data something json
  • 仅获取联系人手机号码

    关于使用联系人 API 获取联系人号码有几个问题 但我想知道是否有一种方法可以识别检索到的号码是手机号码 以下代码通常显示为获取联系人电话号码的一种方式 因为它获取一个或多个电话号码的列表 String projection Contact
  • 如何将 Dto 修补到实体?

    我有一个接受 dto 对象的控制器 我需要更改 dto 对象中存在的字段 PatchMapping value update uuid public ResponseEntity
  • 更改一个对象中的值会更改另一个对象中的值

    我正在努力生成游戏树 我输入的问题是 当我将一个对象复制到新对象 然后在新对象中进行更改时 旧对象也会更改其值 所以这似乎是一个参考问题 但如何使新对象成为一个独立的实例 创建从父对象复制的子对象后 然后更改子对象中的值 父对象也会更改 并
  • 如何确保Tomcat6在Windows上读取CATALINA_OPTS?

    我有一个在 Windows2003 机器上运行的 Tomcat6 我在此服务器上部署了 2 个 Grails 应用程序 很快我就注意到部署后的某个时间一切都崩溃了 并出现了典型的 PermGen 错误 java lang OutOfMemo
  • JPA - COUNT 的最大值或从 SELECT 中选择

    我为 MySQL 编写了以下查询 SELECT subquery t1 column1 subquery t2 id MAX subquery val FROM SELECT t1 column1 as t1 column1 t1 id t
  • 如何在 C# 中使用循环迭代所有 ComboBoxes 控件?

    我在 C 的 winform 上有一些组合框 例如 10 名为 comboBox1 coboBox2 和comboBoxN 我如何在 for 循环中访问所有这些内容 如下所示 for int i 0 i lt 10 i comboBox i
  • 根据值列表重复每个元素

    是否有一个Python内置函数可以根据另一个列表中的相应值重复列表中的每个元素 例如A在列表中x由于值的原因 位置 0 重复了 2 次2位于列表中的位置 0y gt gt gt x A B C gt gt gt y 2 1 3 gt gt
  • 具有不等式条件的合并连接算法

    我读到 Oracle 支持带有不等式连接谓词的合并连接 是否有在线参考用于实现此类连接的算法 如果有人知道该怎么做 你能回答吗 This http docs oracle com cd E16655 01 server 121 e15858
  • 编写和完善 CSV 解析器

    作为最近项目的一部分 我必须从 CSV 文件中读取和写入 然后将其放入 C 中的网格视图中 最后决定使用现成的解析器来为我完成这项工作 因为我喜欢做这类事情 所以我想知道如何自己写 到目前为止 我所能做的就是 Read the header
  • 如何检测属于 gsm/3g-modem 的 tty 是数据端口还是控制端口?

    我目前正在为 Linux 路由器编写一个小工具 当我将适当的调制解调器插入其 USB 端口时 该工具会建立 wwan gsm 3g 连接 当设备插入时 会注册多个 tty 我当前维护一个制造商和设备的列表 以及它们注册的 tty 中的哪个是
  • WinForms 中如何处理不可见控件的绘制?

    我正在尝试覆盖OnPaintwindows窗体中的事件 NET 紧凑框架 到目前为止 我已经能够使用渐变 圆角矩形等来绘制控件 而这通常是常规控件无法实现的 但是 当我想让控件不可见时 我遇到了问题 现在 我所做的就是重新绘制除那些不可见控
  • 为什么在签出 git 远程分支窗口时出现“无法创建目录”?

    我在 Windows 10 64 位上使用 git 版本 2 10 2 windows 1 在 MACOS 上 我们将两个分支合并到一个现有分支中 合并后分支包含一个folder with a 末尾有空白 Jadise 我根据 Bitbuc
  • Memcache密钥生成策略

    给定函数f1它接收 n 个字符串参数 就运行时性能而言 什么被认为更好 memcache 的随机密钥生成策略 我们的 Memcache 客户端对其获取的密钥进行内部 md5sum 哈希处理 public class MemcacheClie
  • “EXC_BAD_ACCESS:无法恢复先前选择的帧”错误,数组大小?

    我有一个算法来创建埃拉托斯特尼筛并从中提取素数 它允许您输入筛子的最大值 算法会为您提供低于该值的素数并将它们存储在 c 样式数组中 问题 值高达 500 000 时一切正常 但是当我在运行时输入一个大值时 它会在 xcode 中给出以下错
  • Java中如何获取变量名? [复制]

    这个问题在这里已经有答案了 可能的重复 Java反射 如何获取变量的名称 https stackoverflow com questions 744226 java reflection how to get the name of a v
  • 设计模式作为(缺失的)语言功能

    有时人们将设计模式称为缺少的编程语言功能 为了避免关于什么是设计模式的争论 假设我们只考虑原始的 GoF 模式 例如 单例模式在 Scala 中消失了 Scala 使用关键字支持单例对象object 关于这方面的资源很少 特别是设计模式是否
  • 如何使用maven shade插件向jar添加资源

    我的项目结构在 src main 文件夹内有 resources 文件夹 resources 文件夹包含文件server properties 我的pom如下