我需要能够为我的项目创建一个可执行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>

如果你通过_2548500在命令行上运行它,一切正常,输出 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)

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