$Class.getResource 从 maven shade 插件打包的 fat jar 失败
$Class.getResource failed from fat jar packed by maven shade plugin
我的 java/scala 程序需要 javescript 代码片段的支持。所以我把它放在我的资源文件夹中:
resources
|- sizzle.js
并且在我的 pom.xml 中显式地将其包含在由 maven shade 插件编译的 fat/uber jar 中:
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>resources</resource>
<file>sizzle.js</file>
</transformer>
</transformers>
(我知道这是不必要的,但无论哪种方式都会让我失望)
当我尝试从我的源代码中读取 javascript 片段时:
sizzleSource = IOUtils.toString(Thread.currentThread().getContextClassLoader().getResource("sizzle.js"));
它在 IDE 中的 运行 时完美运行,但在执行 fat jar 时出现空指针异常:
...
java.lang.NullPointerException
at org.apache.commons.io.IOUtils.toString(IOUtils.java:894)
at org.apache.commons.io.IOUtils.toString(IOUtils.java:879)
...
那么为什么maven shade插件在这种情况下会失败?我可以在 fat jar 的根目录中看到 sizzle.js,但这没有什么区别。
文件 sizzle.js
位于最终 jar 的根目录中,因此您需要通过 :
访问它
Thread.currentThread().getContextClassLoader().getResource("/sizzle.js"));
方法ClassLoader.getResource(name)
需要绝对路径来查找资源。
我的 java/scala 程序需要 javescript 代码片段的支持。所以我把它放在我的资源文件夹中:
resources
|- sizzle.js
并且在我的 pom.xml 中显式地将其包含在由 maven shade 插件编译的 fat/uber jar 中:
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>resources</resource>
<file>sizzle.js</file>
</transformer>
</transformers>
(我知道这是不必要的,但无论哪种方式都会让我失望)
当我尝试从我的源代码中读取 javascript 片段时:
sizzleSource = IOUtils.toString(Thread.currentThread().getContextClassLoader().getResource("sizzle.js"));
它在 IDE 中的 运行 时完美运行,但在执行 fat jar 时出现空指针异常:
...
java.lang.NullPointerException
at org.apache.commons.io.IOUtils.toString(IOUtils.java:894)
at org.apache.commons.io.IOUtils.toString(IOUtils.java:879)
...
那么为什么maven shade插件在这种情况下会失败?我可以在 fat jar 的根目录中看到 sizzle.js,但这没有什么区别。
文件 sizzle.js
位于最终 jar 的根目录中,因此您需要通过 :
Thread.currentThread().getContextClassLoader().getResource("/sizzle.js"));
方法ClassLoader.getResource(name)
需要绝对路径来查找资源。