2017-04-13 4 views
7

에서 작동하지 않습니다 jar 파일 내의 XML 파일에 포함 여기에 시나리오의 :XI가 : 제이보스

내가 .xml.jar 파일에서 실행하는 내 응용 프로그램에 필요한 파일 (다소 구성) 여러 번들.

settings-1.0.0.jar 
˪ resources/ 
    ˪ 1.xml 
    ˪ 2.xml 
    ˪ 3.xml 
˪ META-INF/ 
    ˪ MANIFEST.MF 

1.xml 다음과 같은 내용이 있습니다 : JAR 파일은 다음과 같은 구조를 가지고

<?xml version="1.0" encoding="UTF-8"?> 
<document xmlns:xi="http://www.w3.org/2001/XInclude"> 
    <!-- Include 2 --> 
    <xi:include 
     href="resource:resources/2.xml" /> 
    <!-- Include 3 --> 
    <xi:include 
     href="resource:resources/3.xml" /> 
    <!-- 
    <map> 
    </map> 
    --> 
</document> 

this 기사에 기반.

Caused by: org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 43; An 'include' failed, and no 'fallback' element was found. 
    at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:245) 
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:298) 
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121) 
    at org.zcore.dkp.backend.mapper.MappingParser.parse(MappingParser.java:60) 
    ... 327 more 

내가 시도 (& error'd) 모든 사유 옵션 :이 포함 ​​액세스하려고 할 때 나는 다음과 같은 오류가 발생합니다 (후 성공적으로 내 응용 프로그램을 배포). WildFly 모듈로 jar- 파일에 xi:include.xml 파일에 올바른 조합이 무엇입니까?

편집는 : 여기 XMLFILE가로드 방법은 다음과 같습니다

private void loadBackendMapping() { 
    try { 
     BackendMappingParser parser = new BackendMappingParser(); 
     InputStream in = ResourceLoaderHelper.getResourceAsStream(BACKEND_MAPPING_RESOURCE); 
     if (in == null) { 
      throw new FileNotFoundException(); 
     } 
     try { 
      parser.parse(in); 
     } finally { 
      try { 
       in.close(); 
      } catch (IOException e) { 
       log.warn("Failed to close " + BACKEND_MAPPING_RESOURCE, e); 
      } 
     } 
     backendMapping = parser.getMapping(); 
     if (log.isDebugEnabled()) { 
      log.debug(BACKEND_MAPPING_RESOURCE + " successfully loaded!"); 
     } 
    } catch (FileNotFoundException e) { 
     log.warn("\"" + BACKEND_MAPPING_RESOURCE + "\" not found!"); 
     backendMapping = new BackendMapping(); 
    } catch (Exception e) { 
     throw new CenterwareSystemException("Failed to parse " + BACKEND_MAPPING_RESOURCE, e); 
    } 
} 

BACKEND_MAPPING_RESOURCE 파일 이름 (1.xml)가 포함되어 있습니다.

+0

사용 사례는 무엇입니까? jar 파일에 설정을 패키지화하는 것이 정말로 필요한가요? –

+0

http://stackoverflow.com/questions/8412798/how-to-load-xmlcatalog-from-classpath-resources-inside-a-jar-reliably 도움이되는지 확인 –

+1

만들기에 사용하는 코드를 표시 할 수 있습니까? 파서/매퍼? – ctomc

답변

2

XML 파서에 따라 다릅니다.

예외에 따라 SAX를 사용하는 것 같습니다.
이 글을보십시오 : 는 https://www.ibm.com/developerworks/library/x-tipentres/

위의 문서는 XML 문서에서 자원을 찾기위한 SAX APIEntityResolver 인터페이스를 사용합니다.

1

URL에서 "resource :"접두어를 제거하십시오. JBoss 관련 프로토콜 인 것 같습니다.

1.xml, 2.xml 및 3.xml은 모두 같은 폴더에 있으며 일반적으로 상대 경로 (1 ~ 2 및 1 ~ 3)를 지정하므로 "resource /"경로를 방출하십시오.

는 다음과 같은 시도 :

<?xml version="1.0" encoding="UTF-8"?> 
<document xmlns:xi="http://www.w3.org/2001/XInclude"> 
    <!-- Include 2 --> 
    <xi:include href="2.xml" /> 
    <!-- Include 3 --> 
    <xi:include href="3.xml" /> 
    <!-- 
    <map> 
    </map> 
    --> 
</document> 
+0

스트림의 "상대 경로"란 무엇입니까? 모든 XML 문서가 실제 파일 시스템에서 제공되는 것은 아닙니다 ... –

+0

상대 경로는 예를 들어. 상단에있는 파일 목록의 "resource". 로드 된 1.xml을 관리하는 경우 2.xml 및 3.xml은 1.xml -> 폴더를 제외하고 상대적으로 적용되어야합니다 (질문에 주어진 구조를 따를 때) –

+0

XML 파서는 이것을 모릅니다. 'Document' 나 문자 스트림, 또는 문자를 읽을 수있는 다른 소스를 얻습니다. –