2017-04-26 3 views
0

RDF形式の.owlファイルをJSON形式の文字列に解析するためにJavaでオントロジーインポータを作成しました。より具体的には、静的メソッドparseOntologyObjectHierarchyは、オントロジーで定義されたクラス階層をJSONに解析します。 JUnitテストのメソッドまたはクラスのmainメソッドを呼び出すと、すべて正常に動作します(JUnitとクラスmainはIntelliJ IDEA Professional 2017から呼び出されます)。しかし、私がクラスをすべての依存関係を含むgradleを使ってjarファイルとしてパッケージ化すると、org.semanticweb.owlapi.io.UnparsableOntologyExceptionが得られます。 jarには実際に必要なものが含まれていますRDFXMLParser。 jarファイルのclasspathが正しく設定されていませんか?ここでOWLAPI:Jarから実行するとパーサーが見つかりません

のIntelliJ IDEAプロジェクト最小限の例です:https://drive.google.com/open?id=0B10MbhsMWfrydVNKZVJ0QVg1NlE

そして、ここでは、対応する最小限の瓶である:ここではhttps://drive.google.com/open?id=0B10MbhsMWfrybjJIcDNWd0JFMUk

コードです:ここでは

public static String parseOntologyObjectHierarchy(String filename) throws OWLException { 
    System.out.println("OWL file: " + filename); 
    OWLOntology ontology = loadOntology(filename); 
    OWLDataFactory df = OWLManager.getOWLDataFactory(); 
    return json = hierarchyToString(ontology, df.getOWLThing()); 
} 

public static OWLOntology loadOntology(String filename) throws OWLOntologyCreationException { 
    File ontologyFile = new File(filename); 
    if (!ontologyFile.exists() || !ontologyFile.isFile()) { 
     throw new IllegalArgumentException("OWL file is not a file"); 
    } 
    OWLOntologyManager ontologyManager = OWLManager.createOWLOntologyManager(); 
    OWLOntologyDocumentSource source = new FileDocumentSource(new File(filename), new RDFXMLDocumentFormat()); 
    return ontologyManager.loadOntologyFromOntologyDocument(source); 
} 

は私のbuild.gradleですが。

group 'com.example' 
version '0.1.0-SNAPSHOT' 
apply plugin: 'java' 
sourceCompatibility = 1.8 
repositories { 
    mavenCentral() 
} 
dependencies { 
    compile group: 'net.sourceforge.owlapi', name: 'owlapi-osgidistribution', version: '5.1.0' 
    compile group: 'net.sourceforge.owlapi', name: 'owlapi-apibinding', version: '5.1.0' 
    compile group: 'net.sourceforge.owlapi', name: 'owlapi-parsers', version: '5.1.0' 
    compile group: 'net.sourceforge.owlapi', name: 'owlapi-impl', version: '5.1.0' 

    compile 'com.google.code.gson:gson:2.8.0' 
    compile 'net.sourceforge.owlapi:org.semanticweb.hermit:1.3.8.510' 
    compile group: 'org.glassfish', name: 'javax.json', version: '1.0.4' 
    testCompile group: 'junit', name: 'junit', version: '4.12' 
} 

task fatJar(type: Jar) { 
    manifest { 
    attributes 'Implementation-Title': 'ExampleCom Ontology Importer', 
      'Implementation-Version': version, 
      'Main-Class': 'com.example.ontology.OntologyImporter' 
    } 
    baseName = project.name + '-all' 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    with jar 
} 

ここではexc eptionテキスト:あなたの最小限の瓶で

$ java -jar am-ontology_importer-all-0.1.0-SNAPSHOT.jar 
OWL file: C:/Users/me/Desktop/Projects/example/example-0.1.0.owl 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail 
s. 
Exception in thread "main" org.semanticweb.owlapi.io.UnparsableOntologyException 
: Problem parsing file:/C:/Users/me/Desktop/Projects/example/example-0.1.0.owl 
Could not parse ontology. Either a suitable parser could not be found, or parsi 
ng failed. See parser logs below for explanation. 
The following parsers were tried: 
1) [email protected] 


Detailed logs: 
-------------------------------------------------------------------------------- 

Parser: [email protected] 
    Stack trace: 
Lexical error at line 1, column 22. Encountered: "\n" (10), after : ""  o 
rg.coode.owlapi.obo12.parser.OBOParserTokenManager.getNextToken(OBOParserTokenMa 
nager.java:1059) 
     org.coode.owlapi.obo12.parser.OBOParser.jj_ntk_f(OBOParser.java:296) 
     org.coode.owlapi.obo12.parser.OBOParser.TagValuePair(OBOParser.java:147) 

     org.coode.owlapi.obo12.parser.OBOParser.Header(OBOParser.java:110) 
     org.coode.owlapi.obo12.parser.OBOParser.parse(OBOParser.java:80) 
     org.coode.owlapi.obo12.parser.OWLOBO12Parser.parse(OWLOBO12Parser.java:1 
09) 
     uk.ac.manchester.cs.owl.owlapi.OWLOntologyFactoryImpl.loadOWLOntology(OW 
LOntologyFactoryImpl.java:188) 
     uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.load(OWLOntologyMa 
nagerImpl.java:1072) 
     uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOn 
tologyManagerImpl.java:1033) 
     uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOn 
tologyDocument(OWLOntologyManagerImpl.java:982) 



     at uk.ac.manchester.cs.owl.owlapi.OWLOntologyFactoryImpl.loadOWLOntology 
(OWLOntologyFactoryImpl.java:229) 
     at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.load(OWLOntolog 
yManagerImpl.java:1072) 
     at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OW 
LOntologyManagerImpl.java:1033) 
     at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFro 
mOntologyDocument(OWLOntologyManagerImpl.java:982) 
     at com.example.ontology.OntologyImporter.loadOntology(OntologyImpo 
rter.java:52) 
     at com.example.ontology.OntologyImporter.parseOntologyObjectHierar 
chy(OntologyImporter.java:64) 
     at com.example.ontology.OntologyImporter.main(OntologyImporter.jav 
a:142) 
+0

パーサーはどのようにロード/検出されますか?パーサー(OWLOBO12)が見つかりましたが、それはあなたが望むパーサーではありません。あれは正しいですか?また、ユニットテストとメインをどのように実行するかを確認するのに役立つかもしれません。つまり、IDEまたはコマンドラインを使用していますか?これは、クラスパスの問題をデバッグするのに役立ちます。 – cmonkey

+0

@ cmonkey、私は説明を編集しました:IntelliJ IDEAからクラスメインとJUnitテストを開始します。 jarファイルでは、コマンドラインから実行するか、IntelliJから実行するかにかかわらず、同じ例外がスローされます。パーサーが使われているかどうかは本当に気にしません。RDF XMLを解析できるパーサが必要です。 – balt

+0

@ cmonkey、最小のIntelliJ IDEAプロジェクトとIDEAのプロジェクトで構築したjarファイルへのリンクも追加しました。 – balt

答えて

1

META-INF/servicesフォルダはorg.semanticweb.owlapi.io.OWLParserFactoryの複数のコピーが含まれている - これらはおそらくOWLAPIの依存関係のあなたのマージから来ています。

各モジュールは、このファイルで、モジュールでどのパーサーが見つかるかを宣言します(インスタンスを提供するためにServiceLoaderによって解釈されます)。 owlapi-distributionには、OWLAPIモジュールによって提供されるすべてのファイルのマージされたコピーが含まれています。あなたはそれがあなたのjarファイルに含まれている唯一のファイルであることを確認する必要があります。

このフォルダにある他のファイルについても同様です。

+0

あなたの[メーリングリストの回答](https://sourceforge.net/p/owlapi/mailman/message/35809232/)のおかげで、私はowlapi-distributionの代わりに 'owlapi-osgidistribution'を使うとわかりました'、それは(MWEのために)動作します。 MWEを作成する前の私の間違いは、私が** owlapi-distributionとowlapi-osgidistributionを両方ともGradleの依存関係としていたのに対し、私はowlapi-osgidistributionしか必要としなかったということでした。 – balt

関連する問題