当通过 Maven WAR build/deploy 到 WildFly 时静态初始化块中的 NullPointerException
NullPointerException in static init block when WAR build/deploy to WildFly via Maven
我正在尝试通过 Maven 构建 WAR 并将其部署到 JBoss。当我通过 IntellJ build/deploy 一切正常时。
通过 Maven 部署我得到这个 Stacktrace:
018-02-20 16:59:09,863 ERROR [io.undertow.request] (default task-3) UT005023: Exception handling request to /akkredit-1/akkredit: java.lang.ExceptionInInitializerError
at de.akkredit.Akkreditor.<init>(Akkreditor.java:109)
at de.akkredit.Akkreditor.getModules(Akkreditor.java:106)
at de.akkredit.Akkreditor.akkredit(Akkreditor.java:135)
at de.akkredit.service.Servlet.doPost(Servlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
....
Caused by: java.lang.NullPointerException
at de.akkredit.tools.Tools.<clinit>(Tools.java:41)
... 44 more
工具是一个 Class 具有静态函数和静态初始化块:
try {
String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );
<line 41:> xsltTransformer.setOutputProperty( OutputKeys.INDENT, "yes" );
xsltTransformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2" );
xsltTransformer.setOutputProperty( OutputKeys.ENCODING,"UTF-8" );
xsltTransformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
} catch (TransformerConfigurationException e1) { e1.printStackTrace(); }
见第 41 行
我确实认为发生这种情况是因为未找到资源 transform.xslt
文件位于src/main/resources
在WAR中:WEB-INF/classes/
如果有人能在这里给我提示,我将不胜感激。
此致
亚历克斯
String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );
如果资源驻留在WAR-file中,返回的资源将类似于C:/some/dir/to/the/webapp/WebApp.war!/transform.xslt
,无法用java.io.File
打开。
改用 getResourceAsStream
并将返回的 InputStream
传递给您的 StreamSource
。方法 returns null
如果找不到资源,那么可能会检查并记录它,而不是让整个事情再次崩溃 NullPointerException
。如果发生这种情况,您可以尝试更改要查找的资源,例如到 transform.xslt
(即没有前导斜杠)或真正确保资源实际上位于 war-file 它应该在的位置。
顺便说一句:你提到了 "line 41" 但我在你的代码中没有看到任何信息第 41 行实际上是什么,所以我假设
- 未部署,即驻留在测试系统的目录中,一切正常
- 第 41 行实际上是带有
new StreamSource( new File( xslt ) )
的行,NullPointerException
来自那里。
顺便说一句:你说
The file is located in src/main/resources
in the WAR: WEB-INF/classes/
这是否意味着您的资源驻留在目录 src/main/resources
中,而该目录本身位于 war-file 中的 WEB-INF/classes
中?在这种情况下,您需要将要查找的资源更改为 /src/main/resources/transform.xslt
。如果您的意思是它在您进行测试时驻留在前一个目录中,而当部署为 WAR 时它驻留在后一个目录中,没关系 ;-)
我正在尝试通过 Maven 构建 WAR 并将其部署到 JBoss。当我通过 IntellJ build/deploy 一切正常时。
通过 Maven 部署我得到这个 Stacktrace:
018-02-20 16:59:09,863 ERROR [io.undertow.request] (default task-3) UT005023: Exception handling request to /akkredit-1/akkredit: java.lang.ExceptionInInitializerError
at de.akkredit.Akkreditor.<init>(Akkreditor.java:109)
at de.akkredit.Akkreditor.getModules(Akkreditor.java:106)
at de.akkredit.Akkreditor.akkredit(Akkreditor.java:135)
at de.akkredit.service.Servlet.doPost(Servlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
....
Caused by: java.lang.NullPointerException
at de.akkredit.tools.Tools.<clinit>(Tools.java:41)
... 44 more
工具是一个 Class 具有静态函数和静态初始化块:
try {
String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );
<line 41:> xsltTransformer.setOutputProperty( OutputKeys.INDENT, "yes" );
xsltTransformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2" );
xsltTransformer.setOutputProperty( OutputKeys.ENCODING,"UTF-8" );
xsltTransformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
} catch (TransformerConfigurationException e1) { e1.printStackTrace(); }
见第 41 行
我确实认为发生这种情况是因为未找到资源 transform.xslt
文件位于src/main/resources
在WAR中:WEB-INF/classes/
如果有人能在这里给我提示,我将不胜感激。
此致
亚历克斯
String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );
如果资源驻留在WAR-file中,返回的资源将类似于C:/some/dir/to/the/webapp/WebApp.war!/transform.xslt
,无法用java.io.File
打开。
改用 getResourceAsStream
并将返回的 InputStream
传递给您的 StreamSource
。方法 returns null
如果找不到资源,那么可能会检查并记录它,而不是让整个事情再次崩溃 NullPointerException
。如果发生这种情况,您可以尝试更改要查找的资源,例如到 transform.xslt
(即没有前导斜杠)或真正确保资源实际上位于 war-file 它应该在的位置。
顺便说一句:你提到了 "line 41" 但我在你的代码中没有看到任何信息第 41 行实际上是什么,所以我假设
- 未部署,即驻留在测试系统的目录中,一切正常
- 第 41 行实际上是带有
new StreamSource( new File( xslt ) )
的行,NullPointerException
来自那里。
顺便说一句:你说
The file is located in src/main/resources
in the WAR: WEB-INF/classes/
这是否意味着您的资源驻留在目录 src/main/resources
中,而该目录本身位于 war-file 中的 WEB-INF/classes
中?在这种情况下,您需要将要查找的资源更改为 /src/main/resources/transform.xslt
。如果您的意思是它在您进行测试时驻留在前一个目录中,而当部署为 WAR 时它驻留在后一个目录中,没关系 ;-)