getClass (). getResource - предварительно рабочий каталог - PullRequest
0 голосов
/ 19 января 2020

Я разрабатываю приложение, в котором мне нужно загрузить файл схемы (xsd) как ресурс из файла jar, но путь к файлу getClass (). GetResource («..») получает префикс с рабочим каталогом. .

Это код:

//ClassLoader classLoader = getClass().getClassLoader();
URL xsdUrl = getClass().getResource(
         "/schema_" + XSD_VERSION.replace(".", "_") + ".xsd"
);

xsdUrl должен быть: file: \ D: \ NetBeansProjects \ Java \ reports_cli \ target \ reports_cli-1.0-Beta-jar-with- dependencies.jar! \ schema_1_1.xsd

Но возвращается: C: \ Users \ joao \ file: \ D: \ NetBeansProjects \ Java \ reports_cli \ target \ reports_cli-1.0 -Beta-jar-with-dependencies.jar! \ Schema_1_1.xsd

Префикс C: \ Users \ joao \ к пути к файлу

Это проект: https://github.com/joaomfrebelo/reports_core

и это файл: https://github.com/joaomfrebelo/reports_core/blob/master/src/main/java/rebelo/reports/core/parse/AParse.java

Весь код метода:

public Unmarshaller unmarshallInstance() throws SAXException, JAXBException {
        LOG.trace(() -> "Create unmarshallInstance");
        LOG.trace(() -> "Read xsd file");

        //ClassLoader classLoader = getClass().getClassLoader();
        URL xsdUrl = getClass().getResource(
                "/schema_" + XSD_VERSION.replace(".", "_") + ".xsd"
        );

        LOG.trace(() -> "Creating JAXBContext.newInstance ");
        JAXBContext jaxbContext = JAXBContext.newInstance(Rreport.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        if (xsdUrl == null) {
            LOG.warn(() -> "Schema not seted please put the schema file ('schema_"
                    + XSD_VERSION.replace(".", "_")
                    + ".xsd' in the same folder as your java file");
        } else {
            File xsd = new File(xsdUrl.getFile());
            if (xsd.isFile() && xsd.canRead()) {
                LOG.debug(() -> "Seting xsd shema file '" + xsd.getAbsolutePath() + "'");
                SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
                Schema schema = sf.newSchema(xsd);
                unmarshaller.setSchema(schema);
                LOG.trace(() -> "Schema seted");
            } else {
                LOG.debug(() -> "XSD shema path file '"
                        + xsd.getAbsolutePath()
                        + "' is not a file or is not readable");
            }
        }

        return unmarshaller;
    }

Ответы [ 2 ]

3 голосов
/ 19 января 2020

Ошибка, которую вы делаете, пытается преобразовать его в дескриптор файла:

File xsd = new File(xsdUrl.getFile());

getClass (). GetResource () возвращает URL, который не всегда может быть преобразован в URL файла. В этом случае это URL, который указывает на часть jar.

Что всегда будет работать, так это загрузка ресурса в качестве входного потока.

InputStream xsdStream = xsdUrl.openStream();
StreamSource xsdSource = new StreamSource(xsdStream);
Schema schema = sf.newSchema(xsdSource);

Или используйте Class.getResourceAsStream ( ) метод пропустить шаг URL:

InputStream xsdStream = getClass().getResourceAsStream("/schema_" + ...)
3 голосов
/ 19 января 2020

Проблема не в Class.getResource(). Проблема в том, что ваш код обрабатывает ресурс внутри файла JAR, как если бы он был файлом в файловой системе.

Это не так.

Вы не можете использовать File IO для чтения ресурса внутри файла JAR, и вам это не нужно. Вызовите метод newSchema, который принимает URL в качестве аргумента . Требуется URL, и вот что возвращает Class.getResource().

...