【问题标题】:$Class.getResource failed from fat jar packed by maven shade plugin$Class.getResource 从 maven shade 插件打包的 fat jar 失败
【发布时间】:2015-04-22 15:59:36
【问题描述】:

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

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 sn-p 时:

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,但这并没有什么不同。

【问题讨论】:

  • SomeFatJarClass.getResource("/sizzle.js") 使用 Class.getResource,带有相对路径,或此处为显式绝对路径。如果这样可行,那就是 ClassLoader 问题。

标签: java scala maven maven-shade-plugin


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!但这会在 IDE 中执行时破坏单元测试,因为 getResource("/sizzle.js") 如果不在 fat jar 中运行,则无法获取 /source 文件夹中的文件。有没有可以同时处理这两种情况的解决方案?
  • 你应该把sizzle.js放在src/main/resources下面。这样,它将自动添加到 uber jar 中(最终将位于最终 jar 的根目录,因此您不必手动添加它)并且不会破坏您的单元测试(如果您使用 @ 访问此文件987654327@).
  • 这正是它所在的地方!然而“sizzle.js”可以很好地评估,但“/sizzle.js”会让我得到java.lang.NullPointerException。我的 IntelliJ IDEA Ultimate IDE 应该处理资源文件夹,因为 src 和测试资源文件夹都被清楚地标记并且 sizzle.js 在两者中
  • 嗯,也许这是一个 ClassLoader 问题。尝试使用当前的类加载器getClass().getClassLoader()
  • 最后一个解决方案就像魔术一样! (虽然我必须将它包含在非静态函数中但到目前为止它不会造成任何问题) ContextClassLoader 确实是罪魁祸首
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 2023-03-15
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2020-08-06
  • 2012-06-13
相关资源
最近更新 更多