$ class.getResource从maven shade插件包装的胖jar失败了

时间:2015-02-20 20:56:09

标签: java scala maven maven-shade-plugin

我的java / scala程序需要javescript代码片段的支持。所以我把它放在我的资源文件夹中:

resources
|- sizzle.js

在我的pom.xml中明确地将它包含在由maven shade plugin编译的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插件会在这种情况下失败?我能够在胖罐的根目录中看到sizzle.js,但它没有什么区别。

1 个答案:

答案 0 :(得分:0)

文件sizzle.js最终位于最终jar的根目录,因此您需要通过以下方式访问它:

Thread.currentThread().getContextClassLoader().getResource("/sizzle.js"));

方法ClassLoader.getResource(name)需要绝对路径来查找资源。