2016-06-28 4 views
0

Я написал код, который управляет RDF, и поэтому зависит от jena framework. Я пытаюсь скомпилировать/упаковать его с помощью maven. Компиляция завершается, но когда я пытаюсь запустить созданный файл банку, я получаю:Компиляция класса, который зависит от jena

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at my.package.name.ClassName.<clinit>(SchemaAPI.java:96) 
Caused by: java.lang.NullPointerException 
    at org.apache.jena.tdb.sys.EnvTDB.processGlobalSystemProperties(EnvTDB.java:33) 
    at org.apache.jena.tdb.TDB.init(TDB.java:250) 
    at org.apache.jena.tdb.sys.InitTDB.start(InitTDB.java:29) 
    at org.apache.jena.system.JenaSystem.lambda$init$40(JenaSystem.java:114) 
    at java.util.ArrayList.forEach(ArrayList.java:1249) 
    at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:179) 
    at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:156) 
    at org.apache.jena.system.JenaSystem.init(JenaSystem.java:111) 
    at org.apache.jena. 

Это обсуждалось ранее (например, here и here), но я изменил мой файл POM, чтобы включить плагин тени - и это не решило проблему, и я ударил немного кирпичной стены ...

Основываясь на комментариях в обсуждениях в ссылках выше, я проверил файл META-INF/services/org.apache.jena.system.JenaSubsystemLifecycle в своем файле my-project-0.1-jar-with-dependencies.jar, и он действительно содержат ссылку на TDB (org.apache.jena.tdb.sys.InitTDB) - поэтому я знаю, что это (почти наверняка) причина проблемы, но я не могу найти решение ...

Я также включаю в себя maven-dependency-plugin и maven-compiler-plugin - Я предполагаю, что это не вызовет конфликта?

Дополнительная информация

Некоторые дополнительные данные в ответ на комментарий Andy S в. Соответствующая часть моего файла ПОМ:

<transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
    <mainClass>uk.co.domain.mypackage.MyClass</mainClass> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" /> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer"> 
    <addHeader>false</addHeader> 
    </transformer> 
</transformers> 

соответствующий файл в META-INF содержит только один класс:

$more META-INF/services/org.apache.jena.system.JenaSubsystemLifecycle 
org.apache.jena.tdb.sys.InitTDB 
$ 

Я также попытался добавить

JenaSystem.init(); 

в начале мой основной класс, но это не помогло

+0

У вас есть репозиторий github или что-то, где у вас есть код, который вы пытаетесь запустить? – Ulises

+0

Почему бы вам не использовать данную версию из maven central вместо ее создания? –

+0

@Ulises нет, извините (политика компании о том, чтобы не выпускать какой-либо код ...: /) - я мог бы попробовать и сделать (относительно) минимальный пример, но хотел бы проверить, что, вероятно, не будет очевидной ошибки. Я – ChrisW

ответ

0

Это не проблема в классе, это eithe r неправильное использование или проблема неправильной конфигурации. В принципе, вы получаете исключение нулевого указателя at line 33 of EnvTDB, в частности TDB.getContext() возвращает null. Возможно, сначала попробуйте запустить это:

org.apache.jena.query.ARQ.init(); 
+0

Извините - это не решило его ... – ChrisW

+0

Попробуйте отладить его, узнайте, где он не работает. –

+0

Ошибка такая же, как в моем первоначальном вопросе - я не совсем уверен, как даже начать отлаживать ее, учитывая, что она связана с тем, как maven пакеты внешних банок – ChrisW

Смежные вопросы