【问题标题】:Make maven dependency OSGi ready准备好maven依赖OSGi
【发布时间】:2015-12-04 12:00:58
【问题描述】:

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

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

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

Maven 依赖没有为 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 的依赖项。

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

请帮我详细解答,我真的卡在这里了。

【问题讨论】:

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


【解决方案1】:

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

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

依赖会安装在 Fuse 服务器中,可以通过命令验证。

osgi:list

现在只需在 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】:

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

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

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

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

    然后你只需要像pax jdbc docs 中描述的那样创建一个配置。

    【讨论】:

    • +1 为您的 OSGi 就绪 jdbc 建议。我关注了你的博客,效果很好。但我还需要添加其他 OSGi 未准备好的依赖项,例如 org.jdbi。你能建议我已经准备好 OSGi 的 jdbi 或使非 OSGi 准备好的依赖项 OSGi 准备好的方法吗?
    【解决方案3】:

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

    你也可以建立一个 Kar 档案来避免这种情况。

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

    【讨论】:

    • 我修复了 jdbc 问题,但现在我需要使用 jdbi。 jdbi 在 karaf 控制台 OSGi 捆绑列表中显示为活动状态。但问题没有解决。
    【解决方案4】:

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

    【讨论】:

    • 我必须使用 org.jdbi。 org.skife.jdbi.* 包抛出接线异常,以上包需要org.antlr.stringtemplate包。现在您能否说明如何为这种情况创建包装器。我试图创建包装器,但它不起作用。
    • 这是我在将 maven 组件包装到 OSGi 时遵循的过程:
    • a) 查看依赖关系树,然后查看 Eclipse 和 Orbit 存储库以查看是否已经打包了依赖项(例如 org.json、javax.transaction、junit,...) b) 如果许多依赖项很小,它们在 Eclipse 和 Orbit 存储库中不可用 - 尝试使用 p2-maven-plugin。在某些情况下,它不能很好地工作。 c) 如果存在现有的包装依赖项或 p2-maven-plugin 不能正常工作(例如,在 Selenium WebDriver 的情况下) - 在 Eclipse 中创建一个包含所有未包装依赖项 jar 的插件项目,添加包装依赖项并使用 Tycho 构建一个 repo /马文
    • 可以以我的第三方仓库为例:www.nasdanika.org/third-party.zip
    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2012-04-20
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多