2017-03-20 23 views
0

概要:昨年、WebアプリケーションをWebSphere 5/Java 4からTomcat 7/Java 7に移植した請負業者を監督しました。今年は、少し使い慣れた機能が壊れていることがわかりました。組織の変更により、この分野で働くチームは私だけになりましたので、これ以上話す人はいません。Java getClass()。getClassLoader()。getResource( "/My_Form.xsd")はnullを返します。

私はこの問題を、getClass()。getResource( "/ My_Form.xsd")がnullを返すまで追跡しました。私は明らかにチェックした:warファイルのルートはMy_Form.xsdを含み、Tomcatがwarファイルを爆発させるディスク上に座っている。

ここでは、コード(少し元のJava 4のバージョンからリファクタリング)です:

package com.mycompany; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

... 

public class MyFormMaintenanceFactory { 
... 
    public DocumentBuilderFactory getDocumentBuilderFactory() 
    throws Exception 
    { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

     dbf.setValidating(true); 
     dbf.setNamespaceAware(true); 
     dbf.setIgnoringComments(true); 
     dbf.setIgnoringElementContentWhitespace(true); 
     dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); 

     String schema = "/My_Form.xsd"; 
     URL schemaUrl = getClass().getClassLoader().getResource(schema); 
     if (schemaUrl == null) { 
      throw new Exception("Could not getResource " + schema); 
     } 
     dbf.setAttribute(JAXP_SCHEMA_SOURCE, schemaUrl.toExternalForm()); 
     return dbf; 
    } 
... 
} 

出力は "スロー新しい例外(...)" ラインからのスタックトレースです:

17:38:56.756(03/20) INFO MyApp : java.lang.Exception: Could not getResource /My_Form.xsd 
は、

とスタックトレース。

私は他の形式の通話を試みました。これらのどちらもが任意のより良い仕事:

URL schemaUrl = getClass().getResource("/My_Form.xsd"); 
URL schemaUrl = DocumentBuilderFactory.class.getClassLoader().getResource(schema); 

応答でのgetResource()がnullを返すについて別の質問に、提案がAppName.war tfをjarファイルを実行することでした。

私はそれをやった、とMy_Form.xsdはwarファイルのルートにある:

$ jar tf MyApp-3.0.1-SNAPSHOT.war 
META-INF/ 
META-INF/MANIFEST.MF 
Global/ 
... 
Modules/ 
... 
shared/ 
theme/ 
WEB-INF/ 
WEB-INF/classes/ 
WEB-INF/classes/com/ 
... 
WEB-INF/classes/resources/ 
WEB-INF/lib/ 
WEB-INF/lib/tomcat_jars/ 
... 
WEB-INF/struts-config/ 
WEB-INF/taglibs/ 
Global/css/components/basicControl.css 
... 
Global/image/arrow.gif 
Global/image/atsign.jpg 
Global/image/banner_background.gif 
... 
Global/JavaScript/components/ajax.js 
,,, 
Global/jsp_pages/components/basicControl.jsp 
Global/jsp_pages/components/basicControlTitle.jsp 
... 
index.jsp 
... 
Modules/Global_Internal/jsp_pages/body.jsp 
Modules/Global_Internal/jsp_pages/layout.jsp 
Modules/Global_Internal/jsp_pages/sidebar.jsp 
Modules/help/FAQ.html 
... 
shared/searchUtil.js 
... 
showAllTickets.jsp 
showAllTickets_body.jsp 
My_Form.xsd 
theme/Master.css 
WEB-INF/classes/com/mycompany/MyFormMaintenanceFactory.class 
WEB-INF/classes/com/mycompany/MyFormMaintenanceFactory.java 
... 
WEB-INF/classes/resources/MyApp.properties 
... 
WEB-INF/lib/commons-beanutils-1.7.0.jar 
WEB-INF/lib/commons-beanutils.jar 
WEB-INF/lib/commons-chain-1.2.jar 
WEB-INF/lib/commons-collections-2.1.jar 
... 
WEB-INF/web.xml 
META-INF/maven/ 
... 
$ 

私は他の人がこのエラーを持っていることについて見つけることができるドキュメントおよびすべてのページを読んで、コードが間違って何をしているのか分かりません。同じ呼び出しがWebSphere 5/Java 4で機能しました。私は感謝してすべての提案を受け入れます...

+0

「WEB-INF/classes/resources /」に移動してみてください – pvg

答えて

1

リソースは、爆発した戦争の/WEB-INF/classesフォルダーにある必要があります。ファイルの絶対パスは<root-dir>/WEB-INF/classes/My_Form.xsdである必要があります。通常、ビルドプロジェクトのsrc/main/resourcesにファイルを置くと、モダンなビルドツール(Mavenなど)は、warアーカイブが作成されるときに通常/WEB-INF/classesのwarアーカイブに正しくコピーされます。

+0

それでした!ありがとうございました! –

関連する問題