使maven依赖OSGi准备就绪

时间:2015-12-04 12:00:59

标签: java maven osgi osgi-bundle embedded-osgi

我试图在JFUSE项目中连接数据库。我在pom文件中包含了com.mysql.jdbc依赖项,项目构建运行正常。但后来我遇到了这个恼人的问题。当我尝试将软件包安装到OSGi时,安装失败并出现以下错误:

无法启动软件包mvn:com.info.demo / demo-rest / 1.0:未解析的const 捆绑com.info.demo.rest中的raint [363]:无法解析363.0:缺少需求[363.0] osgi.wiring.package; (osgi.wiring.package = com.mysql.jdbc)

我尝试了SO的所有可用解决方案,但他们没有解决问题。当我试图找到错误原因时,我在IDE中看到了mysql依赖声明中的警告:

Maven Dependency不是OSGi

所以,我猜主要原因是我的依赖关系还没有为OSGi容器做好准备。 任何人都可以帮助我如何让maven依赖OSGi做好准备吗?

下面是我的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/maven-v4_0_0.xsd">

***Project specific declarations here***

<build>    
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.1.0</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                    <Fragment-Host>org.springframework.jdbc</Fragment-Host>
                    <Import-Package>com.mysql.jdbc</Import-Package>
                </instructions>
            </configuration>                
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>com.mysql.jdbc</groupId>
        <artifactId>com.springsource.com.mysql.jdbc</artifactId>
        <version>5.1.6</version>
    </dependency>
   ***Other Dependencies***
</dependencies>

修改 我遵循了克里斯蒂安的建议而且效果很好。但我需要添加其他非OSGi准备的依赖项。

我在FUSE服务器上安装了非OSGi依赖项。并且还包装依赖关系,但没有解决问题。

请帮我详细解决方案,我真的卡在这里。

4 个答案:

答案 0 :(得分:2)

对于mysql驱动程序,您不必自己进行包装。可以从maven central获得的mysql连接器j已经准备好了OSGi。 maven坐标是mvn:mysql / mysql-connector-java / 5.1.34。

由于在OSGi中使用普通的jdbc驱动程序并不容易,我建议你也使用pax-jdbc。它允许通过提供一些配置来创建DataSource作为OSGi服务。

你可以这样安装(在Karaf&gt; 3中): 功能:repo-add pax-jdbc 0.7.0 功能:安装事务pax-jdbc-mysql pax-jdbc-config pax-jdbc-pool-dbcp2

这已经为MySQL提供了DataSourceFactory,并启用了配置和池支持。

然后你只需创建一个如pax jdbc docs所描述的配置。

答案 1 :(得分:2)

经过几天的搜索,我终于找到了最简单的解决方案。 通过在Karaf或ServiceMix终端中使用这个简单的osgi wrap 命令,可以使非OSGi包准备好OSGi:

osgi:install wrap:mvn:org.jdbi / jdbi / 2.70

依赖关系将安装在Fuse服务器中,可以使用命令验证。

<强>的OSGi:列表

现在只需在pom中添加依赖项。

<dependency>
    <groupId>org.jdbi</groupId>
    <artifactId>jdbi</artifactId>
    <version>2.70</version>
</dependency>

Idea仍然会警告你依赖不是OSGi就绪,只是忽略它。

最后在maven bundle插件中导入所需的包,你就完成了。

<plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>${version.maven-bundle-plugin}</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Import-Package>
                        org.skife.jdbi.v2,
                        org.skife.jdbi.v2.util,
                        org.skife.jdbi.cglib.proxy,
                        org.skife.jdbi.v2.sqlobject.stringtemplate,
                        org.skife.jdbi.v2.sqlobject,
                        org.skife.jdbi.cglib.core
                    </Import-Package>
                </instructions>
            </configuration>
        </plugin>

希望这将有助于将来。

答案 2 :(得分:0)

该错误意味着Fuse不知道mysql驱动程序的包。您需要手动安装它。由于mysql连接器是捆绑形式,因此更容易在OSGI环境中安装它。只需使用osgi:install,然后使用捆绑包的名称。

您还可以构建一个Kar存档来避免这种情况。

或者使用Christian提到的Karaf / Fuse自己的sql驱动程序。

答案 3 :(得分:0)

对于非OSGi准备的Maven依赖项,有一个maven插件可以扭曲它们 - https://github.com/reficio/p2-maven-plugin,一个教程 - http://www.vogella.com/tutorials/EclipseTycho/article.html#d314078e1011。这种方法适用于简单组件,但对于具有大量依赖关系或大量导出包的组件,您可能需要手动创建包装器包,例如,我不得不为pegdown,selenium和selendroid手动创建包装包。