当WAR通过Maven构建/部署到WildFly时,静态init块中的NullPointerException

时间:2018-02-20 18:00:36

标签: java maven jboss wildfly

我正在尝试通过maven为JBoss构建和部署WAR。当我通过IntellJ构建/部署时,一切正常。

通过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$3.<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

Tools是一个带有静态函数和静态初始化块的类:

    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 /

如果有人能在这里给我一个提示,

会很感激。

问候

亚历

1 个答案:

答案 0 :(得分:1)

    String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
    xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );

如果资源位于WAR文件中,则返回的资源将类似于C:/some/dir/to/the/webapp/WebApp.war!/transform.xslt,而java.io.File无法打开。

使用getResourceAsStream代替并将返回的InputStream传递给您的StreamSource。如果找不到资源,该方法将返回null,因此可能会检查并记录该资源,而不是让整个事件再次使用NullPointerException崩溃。如果发生这种情况,您可以尝试更改要查找的资源,例如:到transform.xslt(即没有前导斜杠)或者确实确保资源实际上在战争文件中它应该是。

顺便说一句:你提到过#41;第41行&#34;但我在代码中看不到第41行的任何信息,所以我认为

  1. 取消部署,即驻留在测试系统的目录中,一切都按预期工作
  2. 第41行实际上是new StreamSource( new File( xslt ) )的行,而NullPointerException来自那里。
  3. BTW2:你说

      

    该文件位于src / main / resources

    中      WAR中的

    :WEB-INF / classes /

    这是否意味着您的资源位于战争文件中src/main/resources所在的目录WEB-INF/classes中?在这种情况下,您需要更改资源以查找/src/main/resources/transform.xslt。如果您在进行测试时意味着它位于前一个目录中,并且在部署为WAR时它位于后者中,请不要介意; - )