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

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

常翰
2023-03-14
<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,并且在清单中提到了main类。我有以下几个问题:

>

  • 目标文件夹包含classes文件夹,而classes文件夹中有类文件。罐子里也有它们,所以为什么需要它们。我的目标是拥有一个只包含所有依赖项的可执行jar。

    这些资源根本没有被添加到jar中。我已经根据网上看到的说明添加了变压器,但是没有用!!!

    我完全没有关于如何包含资源的线索。感谢任何帮助!!

    编辑::::

    这是我用于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>
    

    另外,我也不明白为什么从我的代码中引用的jar文件会包含在jar中以及META-INF文件夹中。

  • 共有1个答案

    宁飞宇
    2023-03-14

    问题不在您的maven-shade-plugin的配置中,而是您显式地将资源目录设置为错误的路径:

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

    正如 元素的doc所说:“描述存储资源的目录。路径是相对于POM的。”

    因此,如果您遵循默认的maven项目结构,您必须这样设置:

        <!-- correct -->
        <directory>src/main/resources</directory>
    
     类似资料:
    • 问题内容: 我想在JAR文件中包含资源文件(图像,文本文件…)。我将资产文件夹添加到类路径中,因此当我在netBeans中运行该程序时,程序运行正常。 但是,如果我构建项目,则会收到错误消息: 这是正常错误吗? 所以我试图像这样手动添加资产: 但这行不通。我有事吗?对不起,我的英语,谢谢您的帮助。 问题答案: 不要将文件放在桌面上。转到项目的Source文件夹,然后将其复制到该文件夹​​中。在Ne

    • 我正在使用IntelliJ IDEA14,我想在src之外向JAR文件添加文件。这是我目前的项目结构。 我想将layout.txt和saveddata.txt添加到JAR文件可执行文件中。我在网上搜索了一段时间也找不到解决方法 以防你需要看我的代码。这就是我读取文件的方式 这是我的项目结构

    • 如何使用Gradle将配置文件或任何其他资源添加到我的jar中? 我的项目结构: Com/Perseus/..----Java包(类文件) config/*.xml--Spring配置文件

    • 直到最近,我还只是在使用一个简单的Java项目。我最近决定将其升级为使用gradle包装器和NetBeans12,但现在该程序无法检测beep3.wav文件。 我看过这个、这个和很多其他的页面,但是没有一个关于向jar添加文件的信息,所以我假设我正在寻找错误的信息。 你能帮个忙吗?我只需要获得wav文件,以便在构建项目时自动插入到jar中。

    • 我想将google services的Gradle插件从本地jar应用到Java项目中,这样我的构建就不需要连接到jcenter来下载插件。 我已经下载了,但是我不知道如何告诉gradle从文件中加载插件。 这是我的构建。格雷德尔

    • 问题内容: 我通过Java程序读取的路径中有hibernate.cfg.xml和test.txt。现在,当我使用maven创建jar时,这些文件不存在。所以我读到我应该放在资源文件夹中,所以现在我的目录结构是 scr->主要-> Java 现在我可以看到jar中的文件,但是它们根本不在资源文件夹中 myjar.jar-> com(源代码) 我尝试使用访问 getClass()。getResourc