为什么OSGI捆绑模块会被构建两次

时间:2017-05-23 18:28:43

标签: java maven osgi

我正在使用Maven构建这个多模块项目。根目录下项目的文件夹结构如下:

core (dir)
  |--- pom.xml
  |--- pom (dir)
        |---com.loc.dist.core.msp.osgi.pom (dir)
                 |---pom.xml
  |--- com.lgc.dist.core.msp.example.helloservice.client (dir)
                  |---pom.xml

项目com.lgc.dist.core.msp.example.helloservice.client打包为OSGI bundle,它是com.loc.dist.core.msp.osgi.pom

的子模块
<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>
    <parent>
        <groupId>com.lgc.dist</groupId>
        <artifactId>com.lgc.dist.core.msp.osgi.pom</artifactId>
        <relativePath>../pom/com.lgc.dist.core.msp.osgi.pom</relativePath>
        <version>0.1</version>
    </parent>
    <artifactId>com.lgc.dist.core.msp.example.helloservice.client</artifactId>
    <packaging>bundle</packaging>

    <dependencies>
        <dependency>
            <groupId>com.lgc.dist</groupId>
            <artifactId>com.lgc.dist.core.msp.service</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                        <Export-Package>com.lgc.dist.core.msp.example.helloservice.client.*;version=${project.version}</Export-Package>
                        <Private-Package>com.lgc.dist.core.msp.example.helloservice.client.internal</Private-Package>
                        <Import-Package>*</Import-Package>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

顶级pom.xml显示pom文件夹,com.lgc.dist.core.msp.example.helloservice.client位于反应堆列表中。

<modules>
        <module>pom</module>
        <module>com.lgc.dist.core.msp.example.helloservice.client</module>
    </modules>

当我从根运行mvn clean install时,它往往会背靠背构建com.lgc.dist.core.msp.example.helloservice.client两次。可以安装两次,但是当我运行mvn deploy时会造成麻烦。所有其他子模块只构建一次。只有com.loc.dist.core.msp.osgi.pom的子模块正在构建两次。我猜osgi默认构建所有的bundle模块。但是如果我在pom.xml中对它进行评论,那么osgi bundle模块根本就不会构建。我该怎么做才能一次构建这些OSGI包呢?

编辑如果我将打包模式从bundle更改为jar,它可以正常工作,但这会影响使用OSGI包的目的。

2 个答案:

答案 0 :(得分:1)

自项目&#34; com.lgc.dist.core.msp.example.helloservice.client &#34;不是顶级pom.xml的直接子项,请从那里删除它。

因此,在顶级pom.xml中,条目应为:

<modules>
    <module>pom/com.loc.dist.core.msp.osgi.pom</module>
</modules>

pom / com.loc.dist.core.msp.osgi.pom中的pom.xml应该有:

<modules>
    <module>com.lgc.dist.core.msp.example.helloservice.client</module>
</modules>

答案 1 :(得分:0)

经过一些研究,结果是maven-bundle-plugin 2.5.4默认情况下部署捆绑包。根据{{​​3}}的答案之一(我很惊讶它没有获得任何投票),你需要通过添加执行块来停止部署

                 <executions>
                   <execution>
                    <id>default-deploy</id>
                    <phase>no-execute</phase>
                    <goals>
                      <goal>deploy</goal>
                    </goals>
                  </execution>
                </executions>

现在正在运作。

编辑,根据此答案的评论,它在2.5.5中得到解决。但是哈文没试过。