1

以下情况:我正在使用 maven 和 maven-bundle-plugin 开发一个 OSGi 应用程序。我想运行单元测试并发现 Pax-Exam,我发现它退出了合适的。

这是我的父母 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.hswt.oms</groupId>
<artifactId>workspace-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<repositories>
    <repository>
        <id>com.springsource.repository.bundles.release</id>
        <name>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
        <url>http://repository.springsource.com/maven/bundles/release</url>
    </repository>

    <repository>
        <id>com.springsource.repository.bundles.external</id>
        <name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
        <url>http://repository.springsource.com/maven/bundles/external</url>
    </repository>
</repositories>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                    <manifestEntries>
                        <Built-By>Tobias Placht</Built-By>
                        <Bundle-ActivationPolicy>lazy</Bundle-ActivationPolicy>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.3.7</version>
            <configuration>
                <instructions>
                    <Export-Package>{local-packages};version="${project.version}"</Export-Package>
                    <Import-Package>*</Import-Package>
                    <Private-Package>{local-packages}</Private-Package>
                    <Service-Component>*</Service-Component>
                </instructions>
            </configuration>
            <executions>
                <execution>
                    <id>bundle-manifest</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>manifest</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.12.4</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.ops4j</groupId>
            <artifactId>maven-pax-plugin</artifactId>
            <version>1.5</version>
            <configuration>
                <provision>
                    <param>--profiles=ds</param>
                    <param>--platform=equinox</param>
                    <param>mvn:de.hswt.oms/workspace-datastructure-core/0.0.1-SNAPSHOT@2</param>
                    <param>mvn:de.hswt.oms/workspace-command-core/0.0.1-SNAPSHOT@2</param>
                    <param>mvn:de.hswt.oms/workspace-facade/0.0.1-SNAPSHOT@6</param>
                </provision>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.6</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.0.7</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.7</version>
    </dependency>
    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>com.springsource.org.junit</artifactId>
        <version>4.11.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<modules>
    <module>workspace-datastructure-core</module>
    <module>workspace-command-core</module>
    <module>workspace-log-config</module>
    <module>workspace-wsr-create</module>
    <module>workspace-datastructure-local</module>
    <module>workspace-localfile-create</module>
    <module>workspace-localfolder-create</module>
    <module>workspace-facade</module>
    <module>workspace-osgiframework-tests</module>
</modules>

我创建了包含一个简单测试用例的模块 workspace-osgiframework-tests:

import static org.ops4j.pax.exam.CoreOptions.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.Configuration;
import org.ops4j.pax.exam.junit.ExamReactorStrategy;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import javax.inject.Inject;

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

@Inject
BundleContext bu = null;

@Configuration
public Option[] config() {

    return options(junitBundles());
}

@Test
public void getHelloService() {
    for (Bundle b : bu.getBundles()) {
        System.out.println("Bundle " + b.getBundleId() + " : "
                + b.getSymbolicName());
    }
}

}

和对应的 pom.xml

<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<artifactId>workspace-osgiframework-tests</artifactId>

<properties>
    <exam.version>2.5.0</exam.version>
    <url.version>1.4.0</url.version>
</properties>

<parent>
    <groupId>de.hswt.oms</groupId>
    <artifactId>workspace-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
</parent>
<build>
    <plugins>
        <!-- skip plugin execution explicitly -->
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <skip>true</skip>
            </configuration>
            <executions>
                <execution>
                    <id>bundle-manifest</id>
                    <phase>none</phase>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>

    <dependency>
        <groupId>org.ops4j.pax.exam</groupId>
        <artifactId>pax-exam-container-forked</artifactId>
        <version>${exam.version}</version>
        <scope>test</scope>
    </dependency>

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

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

    <dependency>
        <groupId>org.ops4j.pax.url</groupId>
        <artifactId>pax-url-aether</artifactId>
        <version>${url.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.framework</artifactId>
        <version>4.0.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

我运行 mvn test,一切正常,但如果我运行 mvn install,我会收到以下错误:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.546s
[INFO] Finished at: Fri Dec 14 15:37:50 CET 2012
[INFO] Final Memory: 27M/233M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:2.4:jar         (default-jar) on project workspace-osgiframework-tests: Error assembling JAR: Manifest file: /home/knacht/development/repositorys/git/oms/workspace-parent/workspace-osgiframework-tests/target/classes/META-INF/MANIFEST.MF does not exist. -> [Help 1]

知道如何摆脱它吗?

这也是我的第一个 maven 项目,所以如果您有任何建议,请告诉我。

4

1 回答 1

3

当您不熟悉 Maven 和 Pax Exam 时,我建议您尽可能坚持默认设置。

并行使用 maven-jar-plugin 和 maven-bundle-plugin 可能会导致您看到的冲突。将您的捆绑项目的 Maven 打包更改为“捆绑”并让 maven-bundle-plugin 生成清单。通常根本不需要直接使用 maven-jar-plugin。

Pax Exam 2.x 不再支持 maven-pax-plugin。你应该在你的方法中使用bundle()选项。@Configuration

有关最新示例,请查看 Pax Exam 自己的集成测试,网址为https://github.com/ops4j/org.ops4j.pax.exam2/tree/master/itest/src/it/regression-multi

于 2012-12-15T09:27:46.773 回答