嵌入式Neo4j 2.1.6无法在OSGi环境中启动
我们正在使用ApacheServiceMix 5.3.0运行模块化应用程序平台。我需要用持久性服务扩展我们的系统,所以我想构建一个包含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
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环境中缺少的资源
解决方案是在pluginsExport-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>