Jena schemagen в maven обрабатывает множественные онтологии
Я работаю над проектом, который использует несколько онтологий, определенных в нескольких файлах. Я надеюсь использовать Jena для генерации java-классов, чтобы помочь с разработкой, но я не могу найти способ заставить Jena обрабатывать несколько файлов как мавенскую цель.
Я никогда не использовал Jena через maven прежде, но я использовал это в командной строке (никогда для нескольких онтологий одновременно).
Соответствующая часть моего pom.xml приведена ниже (это было в основном скопировано с веб-сайта Jena):
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>jena.schemagen</mainClass>
<commandlineArgs>
--inference \
-i ${basedir}/src/main/resources/ontologies/exception.owl \
--package com.borwell.dstl.mexs.ontology \
-o ${project.build.directory}/generated-sources/java \
</commandlineArgs>
<commandlineArgs>
--inference \
-i ${basedir}/src/main/resources/ontologies/location.owl \
--package com.borwell.dstl.mexs.ontology \
-o ${project.build.directory}/generated-sources/java \
</commandlineArgs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Я хорошо осмотрел веб-сайт Jena и другие сайты (мой googlefoo обычно довольно хороший), но я не смог найти кого-либо еще с этой проблемой или какой-либо документации, объясняющей, как это сделать. Любая помощь по этому вопросу будет очень полезна.
3 ответа
Я написал специальное задание Maven для Jena Schemagen, которое теперь является частью стандартного дистрибутива Jena. Смотрите документацию здесь
РЕДАКТИРОВАТЬ
Этот ответ теперь существует и требует более стандартного решения. А именно, наличие разработанного автора плаката schemagen-maven, включенного в стандартный дистрибутив Jena.
Оригинальный ответ
У вас есть два варианта: создать собственный плагин Maven (который на самом деле не так уж и сложен) или использовать что-то вне maven, чтобы удовлетворить ваши потребности. Я сделал взлом в прошлом, которым я поделюсь с вами. Это не красиво, но работает хорошо.
Этот подход использует Maven Ant Tasks для вызова муравья build.xml
изнутри generate-sources
фаза maven сборки.
Вы начинаете с изменения вашего pom.xml
в том числе следующее:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<taskdef resource="net/sf/antcontrib/antcontrib.properties"
classpathref="maven.runtime.classpath" />
<property name="runtime-classpath" refid="maven.runtime.classpath" />
<ant antfile="${basedir}/src/main/ant/build.xml"
inheritRefs="true">
<target name="my.generate-sources" />
</ant>
</target>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>1.0b3</version>
<exclusions>
<exclusion>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
в build.xml
файл (который, как вы можете видеть, находится в src/main/ant/build.xml
, заключается в следующем.
<?xml version="1.0" encoding = "UTF-8"?>
<!DOCTYPE project>
<project name="my" default="my.error">
<property name="vocab.out.root" location="${basedir}/src/main/java" />
<property name="vocab.package" value = "put something here" />
<property name="vocab.ns" value="put something here" />
<path id="my.vocabulary">
<fileset dir="${basedir}/src/main/resources/put something here" casesensitive="yes" >
<include name="**/*.owl" />
</fileset>
</path>
<scriptdef language="javascript" name="make-proper">
<attribute name="string" />
<attribute name="to" />
<![CDATA[
var raw_string = attributes.get( "string" );
var string_elements = raw_string.split('-');
var nameComponents;
var finalName = "";
var i;
for(i = 0; i < string_elements.length; i++){
var element = string_elements[i];
finalName += element.substr(0,1).toUpperCase() + element.substr(1);
}
project.setProperty( attributes.get( "to" ), finalName );
]]>
</scriptdef>
<!-- target for processing a file -->
<target name="my.schemagen-file">
<echo message="${vocab.file}" />
<!-- for constructing vocab file name -->
<local name="source.file.dir" />
<dirname property="source.file.dir" file="${vocab.file}" />
<local name="source.file" />
<basename property="source.file" file="${vocab.file}" suffix=".owl" />
<local name="vocab.name" />
<make-proper string="${source.file}" to="vocab.name" />
<!-- for constructing destination file name -->
<local name="vocab.package.path" />
<propertyregex property="vocab.package.path" input="${vocab.package}" regexp="\." replace="/" global="true" />
<local name="dest.file" />
<property name="dest.file" value="${vocab.out.root}/${vocab.package.path}/${vocab.name}.java" />
<!-- Determine if we should build, then build -->
<outofdate>
<sourcefiles path="${vocab.file}" />
<targetfiles path="${dest.file}" />
<sequential>
<!-- Actual construction of the destination file -->
<echo message="--inference --ontology -i ${vocab.file} -a ${vocab.ns} --package ${vocab.package} -o ${vocab.out.root} -n ${vocab.name}" />
<java classname="jena.schemagen" classpath="${runtime-classpath}">
<arg line="--ontology --nostrict -i ${vocab.file} -a ${vocab.ns} --package ${vocab.package} -o ${vocab.out.root} -n ${vocab.name}" />
</java>
</sequential>
</outofdate>
</target>
<!-- Maven antrun target to generate sources -->
<target name="my.generate-sources">
<foreach target="my.schemagen-file" param="vocab.file" inheritall="true">
<path refid="my.vocabulary"/>
</foreach>
</target>
<target name="my.error">
<fail message="This is not intended to be executed from the command line. Execute generate-sources goal using maven; ex:\nmvn generate-sources" />
</target>
</project>
Прогуливаюсь по всему.
-
maven-antrun-plugin
выполняет наш скрипт сборки, убедившись, что доступен antcontrib, а такжеmaven.runtime.classpath
, Это гарантирует, что свойства, которые будут доступны в maven, также доступны и в задаче ant. - Если
build.xml
вызывается без указания задачи, она намеренно завершается неудачей. Это помогает вам не использовать его неправильно. - Если
my.generate-sources
цель выполнена, то мы можем использоватьforeach
из antcontrib для обработки каждого файла в указанном вами каталоге. Настройте этот шаблон файла, как вам нужно. Обратите внимание, что предполагаемое расширение.owl
используется в другом месте. - Для каждого файла совы,
my.schemagen-file
цель называется. Я используюlocal
Переменные по порядку делают эту функцию. - Пользовательская задача муравья (определена в javascript и называется
make-proper
) помогает генерировать имена файлов назначения для ваших файлов. Я использую соглашение, где мои словарные файлы находятся вsome-hyphenated-lowercase-structure.owl
, Мое желаемое имя класса для этого будетSomeHyphenatedLowercaseStructure.java
, Вы должны настроить это так, как считаете нужным. - Для каждого производного имени файла мы проверяем, существует ли оно и устарело ли оно. Это удобство позволяет запускать schemagen только в том случае, если исходный файл новее, чем целевой файл. Мы используем
outofdate
Задача сделать это. - Запускаем schemagen. Я использую флаги, специфичные для словарей OWL. Вы можете настроить это, однако, лучше всего подходит для вашей системы.