Acessando arquivos xml e dtd de dentro de um jar

Quando se desenvolve uma aplicação empacotada em um jar, e recursos que devem ser acessados pela aplicação encontram-se dentro do mesmo jar (como arquivos xml ou imagens, por exemplo), pegar uma referência para esses recursos pode ser um tanto complicado.

Devo admitir que quebrei a cabeça para conseguir a referência para um arquivo xml dentro de uma aplicação. Tratava-se na verdade de um caso de parse de um XML através de DOM, e este mesmo XML referenciava um DTD, que se encontrava junto do XML.

O problema é que o parse conseguia acessar o XML, mas se perdia ao tentar encontrar o DTD que o validava. A solução encontrada foi passar a URI do arquivo XML, pois dessa forma o parser consegue buscar o DTD no mesmo caminho.

Passar um InputStream não adianta muito, pois streams não dizem nada a respeito de onde estava o recurso.

Eis um trecho de exemplo, espero que ajude:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
URL xmlFileURL = LanguagesIdentifier.class.getResource("arquivo.xml");
Document doc = docBuilder.parse(xmlFileURL.toURI().toString());

Detalhe: tanto o XML quanto o DTD se encontravam no mesmo local que o arquivo .java que os acessava

[]’s