我需要能够为我的项目创建一个可执行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)
如果有人能指出我正确的方向,或者告诉我如何改变我的小例子以使其发挥作用,我将非常感激!