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

用maven创建的JAR,将资源直接放在JAR中

钱修雅
2023-03-14

我正在使用maven插件创建一个JAR。但是src/main/resources文件夹中的所有文件都直接放在JAR中,而不是resources文件夹中。(根本没有在JAR中创建resources文件夹)

因此,使用JAR的应用程序无法找到log4j2。xml文件。早期的resources文件夹正在创建中,但现在不知何故它没有被创建。

波姆。xml:

<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>testgroup</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <aspectj.version>1.8.10</aspectj.version>
        <java.version>1.8</java.version>
        <codehaus.mojo.version>1.11</codehaus.mojo.version>
        <log4j.version>2.11.1</log4j.version>
        <maven.compiler.plugin.version>3.1</maven.compiler.plugin.version>
        <maven.assembly.plugin.version>2.4.1</maven.assembly.plugin.version>
        <maven.resources.plugin.version>2.6</maven.resources.plugin.version>
        <sonar.maven.plugin.version>3.3.0.603</sonar.maven.plugin.version>
        <artifactory.maven.plugin.version>2.6.1</artifactory.maven.plugin.version>
        <eclipse.lifecycle.mapping.version>1.0.0</eclipse.lifecycle.mapping.version>
        <junit.platform.surefire.provider.version>1.0.1</junit.platform.surefire.provider.version>
        <maven.surefire.plugin.version>2.19.1</maven.surefire.plugin.version>
        <codehaus.mojo.maven.plugin.version>1.6.0</codehaus.mojo.maven.plugin.version>
    </properties>


    <build>
    <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>

                <directory>src</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
                <executions>
                    <execution>
                        <id>default-compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-testCompile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>${maven.assembly.plugin.version}</version>
                <configuration>
                    <!-- get all project dependencies -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <!-- MainClass in mainfest make a executable jar -->
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>package.Test</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjtools</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>${sonar.maven.plugin.version}</version>
            </plugin>
            <plugin>
                <groupId>org.jfrog.buildinfo</groupId>
                <artifactId>artifactory-maven-plugin</artifactId>
                <version>${artifactory.maven.plugin.version}</version>
                <inherited>false</inherited>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>${codehaus.mojo.version}</version>
                <configuration>
                    <complianceLevel>${java.version}</complianceLevel>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <source>${java.version}</source>
                            <target>${java.version}</target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>${codehaus.mojo.maven.plugin.version}</version>
                <configuration>
                    <mainClass>package.Test</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven.surefire.plugin.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${junit.platform.surefire.provider.version}</version>
                    </dependency>
                </dependencies>
            </plugin>

        </plugins>

        <!-- This is added to ignore error in life cycle of aspectj-maven-plugin 
            due to bug in m2eclipse -->
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>${eclipse.lifecycle.mapping.version}</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>org.codehaus.mojo</groupId>
                                        <artifactId>aspectj-maven-plugin</artifactId>
                                        <version>${codehaus.mojo.version}</version>
                                        <goals>
                                            <goal>copy-dependencies</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <execute />
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
        </dependency>

    </dependencies>

</project>

项目结构:

Project
    -----src/main/java
    -----src/main/resources
                 log4j2.xml
    -----src/test/java

罐子结构:

Jar
  -----log4j2.xml

在应用控制台我得到消息:

错误状态记录器Log4j2找不到日志记录实现。请将log4j core添加到类路径。正在使用SimpleLogger登录控制台。。。

共有2个答案

申昌勋
2023-03-14

尝试显式指定输出文件夹,如:

<resources>
    <resource>
        <targetPath>resources</targetPath>
        <directory>src/main/resources</directory>
    </resource>
    <resource>
        <directory>src</directory>
    </resource>
</resources>

希望这有帮助。

干杯

满增
2023-03-14

我的log4j2有问题。我自己多次使用xml文件。首先:maven做了正确的事情,将XML文件放在JAR的根目录中——这正是它所属的位置(链接到文档——请参阅“自动配置”第9点)。

现在,由于Log4j2显然没有找到日志配置,有些事情出错了。

这些可能是:

  • 你的配置文件有语法错误
  • 您的日志文件进行声明,Log4J无法解决(例如,使用在类路径上找不到的特定日志记录器)
  • 您的一个或多个依赖项在依赖项的jar文件的根部也有一个类似名称的log4j2.xml文件。在这种情况下,有一个歧义,Log4J在运行时无法解决
  • 在运行应用程序时,您已经明确指定log4j应该在哪里查找该文件。

在某些情况下,您可能会从log4j那里得到关于发生了什么的提示。无论如何,我建议您使用一个-Dlog4j2.debug=true参数来启动您的应用程序。这将导致Log4J打印出内部调试信息,这将为您提供更多关于正在发生什么的提示。(如果您不知道如何使用-Dparams,请务必查找它,因为它们的定位可能有点棘手。如果没有放在脚本执行的正确位置,它们将被忽略)

我希望这能帮助你明确问题所在。如果没有,那么将应用程序的控制台输出添加到问题中会非常有帮助。理想情况下,调试输出处于打开状态。

 类似资料:
  • 问题内容: 我有一些可怕的行为。我有以下Maven配置: 这将创建包含所有类的JAR文件,但我在类路径中有一些资源也应包括在内。如果我将参数放在阶段的前面,那么我的所有资源都会包括在内。如果我使用运行Maven ,则不包含任何资源。我的资源位于(不是通常的目录)下。 问题答案: 目标配置中未正确定义资源的源目录。同样,outputDirectory元素将资源放置在dir中,默认情况下将其打包。试试

  • 我有一些可怕的比目鱼。我有以下Maven配置: 这创建了包含所有类的JAR fie,但我在类路径中有一些资源也应该包括在内。如果我将参数留在phase前面,那么我的所有资源都包括在内了。如果我使用运行maven,则不包含任何资源。我的资源在(不是通常的目录)下。

  • 我知道这个问题以前被问过很多次,但是我仍然不能管理它工作。我想实现的是创建一个在运行时加载资源(打包在jar中)的jar,而不会在执行Eclipse应用程序时中断资源加载。 我的项目结构是标准的: 加载图像资源的代码: 从Eclipse启动应用程序时,它工作正常。然而,当我从Eclipse导出runnable jar时,它不起作用。 导出的jar在其根目录中有/resources/img文件夹。但

  • 我在Eclipse中有一个简单的maven项目。应用程序包含文件:src/main/Resources/test.txt.我想读取文件并将其写入输出。它在Eclipse中工作,但在创建jar文件后不能从命令行。如何配置项目以两种方式工作。我错在哪里?不正确的jar文件、java代码、清单、maven配置? 应用程序结构: 应用程序结构 运行: 错误: Java代码: pom.xml: fileRe

  • 在使用Maven捆绑JAR文件中的资源时,我有一种感觉,我错过了一些关键的东西。我的目录结构是标准的Maven结构(即\src\main\java,\src\main\Resources)。 使用IDE时,我将资源文件引用为\main\resources\images\blah。。。它工作得很好,但当Maven捆绑JAR文件时,它会将路径放在相对于根的位置(“\ images\blah”),因此没

  • 我想在mvn包目标期间从依赖jar中添加资源,该资源位于myjar.jar:META_INF/public-Resources/myresource.sk到我的webapp/WEB-INF/myfile。有人可以提供建议吗,如何做到这一点?