无法在Maven阴影超级罐中加载资源

时间:2014-05-12 21:43:52

标签: java maven jar maven-shade-plugin

我需要能够为我的项目创建一个可执行jar,其中所有内容都打包在一个jar中。我认为Maven shade build插件是执行此操作的最佳方式,但是在运行创建的超级jar版本时,我遇到了一些加载资源的问题。

为了进一步解释这一点,在尝试加载我的资源时,我遇到了NullPointerException,因为无法找到资源。在创建的jar内部进行检查时,资源位于根目录中,因此无法找出无法找到它们的原因。

为了澄清我的问题,我创建了这个小例子,它打印文件的内容。结构如下: Debug |-- pom.xml `-- src |-- main | `-- java | `-- Main.java |-- resources `- tmp.txt

文件的实际内容是:

Main.java:

import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

    public static void main(String[] args) throws IOException, URISyntaxException {
        URL url = Thread.currentThread().getContextClassLoader().getResource("./tmp.txt");
        Path path = Paths.get(url.toURI());
        String str = new String(Files.readAllBytes(path));
        System.out.println(str);
    }
}

tmp.txt:

Hello World!

的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>debug</groupId>
    <artifactId>debug</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>java</executable>
                    <arguments>
                        <argument>-cp</argument>
                        <classpath/>
                        <argument>Main</argument>
                    </arguments>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>Main</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

如果您通过mvn exec:exec在命令行上运行此操作,一切正常,并输出Hello World!的预期结果。

但是,mvn package后面跟java -jar target/debug-1.0-SNAPSHOT.jar运行会导致以下错误:

Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:12)

如果有人能指出我正确的方向,或者告诉我如何改变我的小例子以使其发挥作用,我将非常感激!

0 个答案:

没有答案