Добавляйте мои собственные исходные коды в pax-exam при сборке с помощью pax-maven-plugin

Я пытаюсь собрать пакет OSGI с помощью pax-maven-build и одновременно протестировать его с помощью pax-exam. В нем есть несколько пакетов, которые я могу протестировать с помощью следующей конфигурации теста pax-exam:

@RunWith(JUnit4TestRunner.class)
@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
public class OSGILoaderTest {

    @Inject
    protected BundleContext bundleContext;

    @Configuration
    public Option[] config() throws MalformedURLException {


        String projectRoot = // a path to my project

        return options(
                junitBundles(),
                equinox(),
                bundle(projectRoot + "libs/org.eclipse.core.variables_3.2.500.v20110511.jar"),
                bundle(projectRoot + "libs/org.eclipse.core.contenttype_3.4.100.v20110423-0524.jar"),
                bundle(projectRoot + "libs/org.eclipse.core.expressions_3.4.300.v20110228.jar"),
                // etc...
        );
    }

    @Test
    public void getBundleContext() throws RodinDBException {
        IRodinDB rodinDB = RodinCore.getRodinDB();
        assertNotNull(rodinDB);
    }
}

Здесь я вижу, что могу получить доступ к экземпляру IRodinDB из предоставленной мною банки.

Теперь у меня есть код моего собственного пакета, который будет использовать весь предоставленный jar. Но я даже не могу проверить свой собственный код, например:

@Test
public void checkAccessToRodinDbTest() {
    VTGService service = null;
    assertTrue(true);
}

выдает ошибку во время компиляции:

[ОШИБКА] Не удалось выполнить цель org.ops4j:maven-pax-plugin:1.5:testCompile (default-testCompile): ошибка компиляции

[ОШИБКА] не может найти символ

Символ [ОШИБКА]: класс VTGService

Кажется, что тестовая компиляция не может видеть 'src/main/java', в отличие от поведения по умолчанию maven-compiler-plugin. Но в моем случае вы можете видеть, что maven использует не плагин компилятора, а maven-pax-plugin.

Вопрос в том, как я могу проверить свой пакет с помощью pax-exam?

update1

Похоже, что это проблема с недавней версией плагина maven-pax-plugin, так как основной пример, доступный в плагине ops4j pax maven (в разделе Использование плагина Pax внутри POM), похоже, страдает той же проблемой.

Update2

По просьбе Дмитрия, это pom.xml моего пакета:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <parent>
        <relativePath>../poms/compiled/</relativePath>
        <groupId>fr.xlim.ssd.vtg.build</groupId>
        <artifactId>compiled-bundle-settings</artifactId>
        <version>0.1-SNAPSHOT</version>
    </parent>

    <properties>
        <bundle.symbolicName>fr.xlim.ssd.vtg.bundle</bundle.symbolicName>
        <bundle.namespace>fr.xlim.ssd.vtg.bundle</bundle.namespace>
    </properties>

    <modelVersion>4.0.0</modelVersion>
    <groupId>fr.xlim.ssd.vtg</groupId>
    <artifactId>fr.xlim.ssd.vtg.bundle</artifactId>
    <version>0.1-SNAPSHOT</version>

    <name>${bundle.symbolicName}</name>

    <packaging>bundle</packaging>

    <dependencies>

        <dependency>
            <type>pom</type>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>provision</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- not needed as equinox bundle are available in provision --> 
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi_R4_core</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi_R4_compendium</artifactId>
            <optional>true</optional>
        </dependency-->

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam</artifactId>
            <version>2.3.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-junit4</artifactId>
            <version>2.3.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-inject</artifactId>
            <version>2.3.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ops4j.pax.url</groupId>
            <artifactId>pax-url-mvn</artifactId>
            <version>1.3.5</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-container-native</artifactId>
            <version>2.3.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ops4j.pax.exam</groupId>
            <artifactId>pax-exam-link-mvn</artifactId>
            <version>2.3.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.0</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.0.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Я не уверен, что это самое элегантное решение, но я создал новый проект maven, когда я могу импортировать свой собственный пакет, как в исходном коде моего вопроса.

Есть ли элегантный способ добавить мои собственные исходники Java непосредственно в качестве нового пакета для тестирования в том же проекте Maven? Это может быть невозможно (поскольку операция сборки пакета выполняется после компиляции и тестирования)...

2 ответа

Решение

Я использую следующую настройку для обеспечения тестируемого пакета. При настройке теста я предоставляю пакет, используя reference-protocol (это нестандартная функция Equinox и Felix, см. здесь):

@Configuration
public Option[] config() {

    return options(         
        bundle("reference:file:target/classes"),
        junitBundles(),
        felix()
        );
}

Тестовые случаи также запускаются при указании knopplerfish() как среда. Я предполагаю, что это потому, что URL разрешается Pax Exam, а не OSGi-runtime. Я использую maven-bundle-plugin для сборки своих пакетов. Чтобы это работало должным образом, вы должны добавить следующую конфигурацию:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.3.7</version>
            <extensions>true</extensions>
            <executions>
                <!-- This execution makes sure that the manifest is available 
                    when the tests are executed -->
                <execution>
                    <goals>
                        <goal>manifest</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

В противном случае манифест не будет доступен при выполнении тестов, поскольку по умолчанию он генерируется во время package-фазы.

Я надеюсь, что ничего не забыл - пожалуйста, дайте мне знать, если это сработало для вас!

Посмотрите документы PaxExam о том, как настроить POM Maven с помощью PaxExam.

Образцы здесь

Другие вопросы по тегам