嵌入式Neo4j 2.1.6无法在OSGi环境中启动

嵌入式Neo4j 2.1.6无法在OSGi环境中启动,neo4j,osgi,apache-servicemix,Neo4j,Osgi,Apache Servicemix,我们正在使用ApacheServiceMix 5.3.0运行模块化应用程序平台。我需要用持久性服务扩展我们的系统,所以我想构建一个包含Neo4J 2.1.6的OSGi包 在我的pom.xml(Maven)中,我使用Maven bundle plugin(org.apache.felix)来构建bundle。我已经将neo4j内核和neo4j lucene索引libs中的几乎所有包添加到部分 部署时,我的捆绑包显示为“已解决”状态。但是当Being开始的时候,它抛出了这样的信息: org.osgi

我们正在使用ApacheServiceMix 5.3.0运行模块化应用程序平台。我需要用持久性服务扩展我们的系统,所以我想构建一个包含Neo4J 2.1.6的OSGi包

在我的
pom.xml
(Maven)中,我使用
Maven bundle plugin
(org.apache.felix)来构建bundle。我已经将
neo4j内核
neo4j lucene索引
libs中的几乎所有包添加到
部分

部署时,我的捆绑包显示为“已解决”状态。但是当Being开始的时候,它抛出了这样的信息:

org.osgi.framework.BundleException: Activator start error ...
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at org.neo4j.graphdb.factory.GraphDatabaseSettings.<clinit (GraphDatabaseSettings.java:69)

我相信这在很大程度上是OSGi类加载器的问题,而不是Neo4J的问题。有什么办法吗?

我同时设法解决了我的问题。正如Neil所想,这既不是OSGi的问题,也不是Neo4J的bug。相反,我必须学习更多关于Neo4J如何绑定其扩展以及如何相应地塑造OSGi依赖关系的课程,以便取得成功

以下是我昨天研究的结果:

(1) 收集所有包裹 我的错误是依赖于
maven bundle plugin
的功能来解析项目,并自动将所有内部依赖项分解到包级别(这是OSGi所必需的)。这非常适用于由
import
语句声明的类关系,但是,当使用反射方法绑定外部内容时,当然会失败

由于该应用程序在我的JUnit环境中工作得很好,所以我出现问题的原因必须包括OSGi环境中缺少的资源

解决方案是在plugins
Export-package
Private-package
Import-package
部分中严格列出每个库的每个包,而不是依赖通配符

(2) Neo4J内核扩展 注意到上述主题,我去掉了前面提到的
ArrayIndexOutOfBoundsException
,但我正好遇到了其他(类似的)异常。在了解了Neo4J的“内核扩展”概念后,我取得了领先

Neo4J(我有2.1.6版)引入了“内核扩展”来耦合可交换模块,以便在运行时进行缓存和索引。为了应用某个扩展,只需要根据类路径添加相应的jar。每个库都在
META-INF/services
下包含一个或多个描述符文件,说明可用的实现。内核会查找和处理这些文件,以便查找和绑定其扩展名(索引和缓存的扩展名是必需的)

在我的捆绑包中安全地包含了所有必要的java包之后,只有
META-INF/services
中的描述符文件丢失了。向我展示了如何将这些资源添加到bundle(在
maven bundle插件中搜索
部分)

Neo4J库还包含一个蓝图描述符,用于自动将主要类发布为服务(例如GraphDatabaseFactory)。这些资源位于
OSGI-INF/blueprint/
下,也应包含在包中

我的Neo4J OSGi捆绑包的最后一个
pom.xml
如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
  <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>my.group</groupId>
    <artifactId>neo4jBundle</artifactId>
    <version>0.1.0</version>
    <packaging>bundle</packaging>
  
    <properties>
      <neo4j-version>2.1.6</neo4j-version>
      <lucene-version>3.6.2</lucene-version>
    </properties>
  
    <dependencies>
      <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-kernel</artifactId>
        <version>${neo4j-version}</version>
      </dependency>
      <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-lucene-index</artifactId>
        <version>${neo4j-version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.2</version>
      </dependency>
    </dependencies>
  
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.felix</groupId>
          <artifactId>maven-bundle-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <instructions>
              <Bundle-Name>org.neo4j.kernel</Bundle-Name>
              <Export-Package>org.neo4j.graphdb.*;version=${neo4j-version},
              ... {all neo4j packages} ...
                org.apache.lucene;version=${lucene-version},
              ... {all lucene packages} ...
                org.slf4j.impl
              </Export-Package>
              <Private-Package>
                javax.transaction,
                javax.transaction.xa,
                ch.qos.logback.classic,
                ... {all logback.classic packages} ...
                ch.qos.logback.core,
                ... {all logback.core packages} ...              
                org.slf4j.*
              </Private-Package>
              <Import-Package>
                javax.lang.model,
                ... {some javax packages to be imported from the runtime} ...
                !sun.misc,
                ... {exclude uneccessary packages to limit dependency} ...
                *
              </Import-Package>
              <Embed-Dependency>
                *;groupId=org.neo4j;artifactId=neo4j-kernel;inline=META-INF/services/*,
                *;groupId=org.neo4j;artifactId=neo4j-kernel;inline=OSGI-INF/blueprint/*,
                *;groupId=org.neo4j;artifactId=neo4j-lucene-index;inline=META-INF/services/*,              
                *;groupId=org.neo4j;artifactId=neo4j-lucene-index;inline=OSGI-INF/blueprint/*              
              </Embed-Dependency>
            </instructions>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </project>

4.0.0
我的团队
neo4jBundle
0.1.0
捆
2.1.6
3.6.2
org.neo4j
neo4j核
${neo4j版本}
org.neo4j
neo4j-lucene指数
${neo4j版本}
org.slf4j
slf4j nop
回写
回归经典
1.1.2
org.apache.felix
maven捆绑插件
真的
org.neo4j.kernel
org.neo4j.graphdb.*;version=${neo4j version},
…{all neo4j软件包}。。。
org.apache.lucene;version=${lucene version},
…{all lucene packages}。。。
org.slf4j.impl
javax.transaction,
javax.transaction.xa,
ch.qos.logback.classic,
…{all logback.classic packages}。。。
ch.qos.logback.core,
…{all logback.core packages}。。。
org.slf4j*
javax.lang.model,
…{一些要从运行时导入的javax包}。。。
!sun.misc,
…{排除不必要的包以限制依赖关系}。。。
*
*;groupId=org.neo4j;artifactId=neo4j内核;inline=META-INF/services/*,
*;groupId=org.neo4j;artifactId=neo4j内核;inline=OSGI-INF/blueprint/*,
*;groupId=org.neo4j;artifactId=neo4j lucene索引;inline=META-INF/services/*,
*;groupId=org.neo4j;artifactId=neo4j lucene索引;inline=OSGI-INF/blueprint/*
备注:这是一个纯库捆绑包,没有任何附加代码。我的带有Activator的应用程序位于一个单独的捆绑包中。
此示例仅显示了我解决问题的方法。我的示例并不声称生成了一个通用Neo4J捆绑包。根据您想要的功能和运行时中已部署内容的社会,您可能需要添加或删除某些包以使所有内容正常工作。

Um。您将获得一个
ArrayIndexOutofBoundsCept您认为这是OSGi类加载问题吗??
 private static String[] availableCaches()
 {
    List<String> available = new ArrayList<>();
    for ( CacheProvider cacheProvider : Service.load( CacheProvider.class ) )
    {
        available.add( cacheProvider.getName() );
    }
 ...
    return available.toArray( new String[available.size()] );
 }
 <?xml version="1.0" encoding="UTF-8"?>
  <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>my.group</groupId>
    <artifactId>neo4jBundle</artifactId>
    <version>0.1.0</version>
    <packaging>bundle</packaging>
  
    <properties>
      <neo4j-version>2.1.6</neo4j-version>
      <lucene-version>3.6.2</lucene-version>
    </properties>
  
    <dependencies>
      <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-kernel</artifactId>
        <version>${neo4j-version}</version>
      </dependency>
      <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-lucene-index</artifactId>
        <version>${neo4j-version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.2</version>
      </dependency>
    </dependencies>
  
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.felix</groupId>
          <artifactId>maven-bundle-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <instructions>
              <Bundle-Name>org.neo4j.kernel</Bundle-Name>
              <Export-Package>org.neo4j.graphdb.*;version=${neo4j-version},
              ... {all neo4j packages} ...
                org.apache.lucene;version=${lucene-version},
              ... {all lucene packages} ...
                org.slf4j.impl
              </Export-Package>
              <Private-Package>
                javax.transaction,
                javax.transaction.xa,
                ch.qos.logback.classic,
                ... {all logback.classic packages} ...
                ch.qos.logback.core,
                ... {all logback.core packages} ...              
                org.slf4j.*
              </Private-Package>
              <Import-Package>
                javax.lang.model,
                ... {some javax packages to be imported from the runtime} ...
                !sun.misc,
                ... {exclude uneccessary packages to limit dependency} ...
                *
              </Import-Package>
              <Embed-Dependency>
                *;groupId=org.neo4j;artifactId=neo4j-kernel;inline=META-INF/services/*,
                *;groupId=org.neo4j;artifactId=neo4j-kernel;inline=OSGI-INF/blueprint/*,
                *;groupId=org.neo4j;artifactId=neo4j-lucene-index;inline=META-INF/services/*,              
                *;groupId=org.neo4j;artifactId=neo4j-lucene-index;inline=OSGI-INF/blueprint/*              
              </Embed-Dependency>
            </instructions>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </project>