Maven bundle 插件生成带有错误或缺失版本的清单
Maven bundle plugin generates Manifest with wrong or missing versions
调试时,为什么我的包中的服务没有被其他包导入,我注意到,我声明了错误的 commons-io 版本(1.4 而不是 2.4)。但是,在调用 mvn clean 然后 mnv install 我注意到,旧版本仍然被引用!此外,org.apache.httpcomponents 的版本未声明!
我的有效 POM 如下所示:
..
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<scope>compile</scope>
</dependency>
...
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
<extensions>true</extensions>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<manifestLocation>META-INF</manifestLocation>
<instructions>
<_noee>true</_noee>
<_removeheaders>Import-Service,Export-Service</_removeheaders>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<manifestLocation>META-INF</manifestLocation>
<instructions>
<_noee>true</_noee>
<_removeheaders>Import-Service,Export-Service</_removeheaders>
</instructions>
</configuration>
</plugin>
我在MANIFEST.MF中看到的是:
Import-Package:
.....................,org.apache.com
mons.io;version="[1.4,2)",org.apache.http,org.apache.http.client,org.ap
ache.http.client.methods,org.apache.http.entity,org.apache.http.impl.cl
ient,org.osgi.service.blueprint;version="[1.0.0,2.0.0)",........
现在 maven-bundle-plugin 的行为对我来说似乎是随机的。有时版本放在 manifest 里,有时不放在,有时同一个 bundle 的包放在 Import-Package 部分,有时不放在 ..... =13=]
是否有任何方法可以强制 maven-bundle-plugin 正确解析来自 maven 依赖项的包版本?我不想手动编写版本,因为这是我们使用 Maven 的目的...
一个可能很重要的注意事项:使用这些导入的 class 在蓝图描述符中声明,这就是 maven-bundle-plugin 在第一行找到包的方式,它看起来像插件蓝图支持存在一些问题...
maven bundle 插件使用一些规则来创建 Import-Package 语句。
- 它只会为实际使用的包创建导入
- 它将查看蓝图并为其中的一些定义创建导入。例如,如果你声明一个 bean class= 那么它将导入包
- 如果您导出一个包,那么 maven-bundle-plugin 也会为它创建一个导入。这允许 OSGi 选择最佳导入。这对你的系统的稳定性来说是件好事。
- 导入的版本取自您在 maven 中引用的包的 Export-Package 语句。如果 Maven 依赖项不是一个包,那么它将从 Maven 版本
中获取版本
在您的情况下,org.apache.commons.io 的导入仍在 [1.4,2) 范围内,因为 commons-io 2.4 包导出此包的版本为 1.4.9999。我想这样做是为了使 commons-io 2.4 与针对 commons-io 1.4 编译的包兼容。
调试时,为什么我的包中的服务没有被其他包导入,我注意到,我声明了错误的 commons-io 版本(1.4 而不是 2.4)。但是,在调用 mvn clean 然后 mnv install 我注意到,旧版本仍然被引用!此外,org.apache.httpcomponents 的版本未声明!
我的有效 POM 如下所示:
..
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<scope>compile</scope>
</dependency>
...
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
<extensions>true</extensions>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<manifestLocation>META-INF</manifestLocation>
<instructions>
<_noee>true</_noee>
<_removeheaders>Import-Service,Export-Service</_removeheaders>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<manifestLocation>META-INF</manifestLocation>
<instructions>
<_noee>true</_noee>
<_removeheaders>Import-Service,Export-Service</_removeheaders>
</instructions>
</configuration>
</plugin>
我在MANIFEST.MF中看到的是:
Import-Package: .....................,org.apache.com mons.io;version="[1.4,2)",org.apache.http,org.apache.http.client,org.ap ache.http.client.methods,org.apache.http.entity,org.apache.http.impl.cl ient,org.osgi.service.blueprint;version="[1.0.0,2.0.0)",........
现在 maven-bundle-plugin 的行为对我来说似乎是随机的。有时版本放在 manifest 里,有时不放在,有时同一个 bundle 的包放在 Import-Package 部分,有时不放在 ..... =13=]
是否有任何方法可以强制 maven-bundle-plugin 正确解析来自 maven 依赖项的包版本?我不想手动编写版本,因为这是我们使用 Maven 的目的...
一个可能很重要的注意事项:使用这些导入的 class 在蓝图描述符中声明,这就是 maven-bundle-plugin 在第一行找到包的方式,它看起来像插件蓝图支持存在一些问题...
maven bundle 插件使用一些规则来创建 Import-Package 语句。
- 它只会为实际使用的包创建导入
- 它将查看蓝图并为其中的一些定义创建导入。例如,如果你声明一个 bean class= 那么它将导入包
- 如果您导出一个包,那么 maven-bundle-plugin 也会为它创建一个导入。这允许 OSGi 选择最佳导入。这对你的系统的稳定性来说是件好事。
- 导入的版本取自您在 maven 中引用的包的 Export-Package 语句。如果 Maven 依赖项不是一个包,那么它将从 Maven 版本 中获取版本
在您的情况下,org.apache.commons.io 的导入仍在 [1.4,2) 范围内,因为 commons-io 2.4 包导出此包的版本为 1.4.9999。我想这样做是为了使 commons-io 2.4 与针对 commons-io 1.4 编译的包兼容。