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 ответа

Решение

После более общего поиска и благодаря DB5 я обнаружил, что решение заключается в нескольких исполнениях. Я надеялся на более элегантное решение, но это работает.

Кредит для DB5

Я написал специальное задание 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>

Прогуливаюсь по всему.

  1. maven-antrun-plugin выполняет наш скрипт сборки, убедившись, что доступен antcontrib, а также maven.runtime.classpath, Это гарантирует, что свойства, которые будут доступны в maven, также доступны и в задаче ant.
  2. Если build.xml вызывается без указания задачи, она намеренно завершается неудачей. Это помогает вам не использовать его неправильно.
  3. Если my.generate-sources цель выполнена, то мы можем использовать foreach из antcontrib для обработки каждого файла в указанном вами каталоге. Настройте этот шаблон файла, как вам нужно. Обратите внимание, что предполагаемое расширение .owl используется в другом месте.
  4. Для каждого файла совы, my.schemagen-file цель называется. Я использую local Переменные по порядку делают эту функцию.
  5. Пользовательская задача муравья (определена в javascript и называется make-proper) помогает генерировать имена файлов назначения для ваших файлов. Я использую соглашение, где мои словарные файлы находятся в some-hyphenated-lowercase-structure.owl, Мое желаемое имя класса для этого будет SomeHyphenatedLowercaseStructure.java, Вы должны настроить это так, как считаете нужным.
  6. Для каждого производного имени файла мы проверяем, существует ли оно и устарело ли оно. Это удобство позволяет запускать schemagen только в том случае, если исходный файл новее, чем целевой файл. Мы используем outofdate Задача сделать это.
  7. Запускаем schemagen. Я использую флаги, специфичные для словарей OWL. Вы можете настроить это, однако, лучше всего подходит для вашей системы.
Другие вопросы по тегам