4

我需要能够为我的项目创建一个可执行 jar,其中所有内容都打包在一个 jar 中。我认为 Maven 阴影构建插件是最好的方法,但是在运行创建的 uber jar 版本时,我在加载资源时遇到了一些问题。

为了进一步解释这一点,在尝试加载我的资源时,我遇到了NullPointerException因为无法找到资源的问题。在创建的 jar 内部检查时,资源位于根目录中,所以我无法弄清楚为什么它无法找到它们。

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

文件的实际内容是:

主.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)

如果有人能指出我正确的方向或告诉我如何更改我的小例子以使其正常工作,我将不胜感激!

4

0 回答 0