$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)需要绝对路径来查找资源。