标签: apache-karaf

OSGI JNDI是否允许与来自非OSGI代码的JNDI调用共存?

OSGI企业版第5版规范第126章提到了兼容性:

"支持Java SE和Java EE客户端使用的传统JNDI编程模型."

和使用OSGI不知道的代码:

"不知道OSGi的客户端和JNDI上下文提供程序使用静态方法连接到JRE JNDI实现.InitialContext类提供从提供程序访问上下文,提供程序使用静态NamingManager方法进行对象转换并查找URL上下文.传统模型不了解OSGi,因此只有在管理这种缺乏OSGi意识的后果时才能可靠地使用它."

但是我不清楚这个文本是仅适用于在OSGI包内执行的"遗留"代码,还是OSGI容器外部的代码,在OSGI容器嵌入应用程序的情况下.

在嵌入方案中,OSGI容器外部和内部可能存在执行JNDI调用的应用程序代码,并且当它们在同一JVM中执行时,它们将共享JNDI实现.

问题:在嵌入式OSGI容器中运行的OSGI JNDI实现是否允许容器外部的OSGI无意识代码像往常一样执行其JNDI调用,或者是否需要移植到"OSGI-awareness"?

使用Apache Karaf 2.3.0(使用Apache Aries JNDI 1.0.0)自己尝试这个似乎不起作用,因为Apache Aries需要JNDI客户端调用来自OSGI包.
部分堆栈跟踪:

javax.naming.NoInitialContextException: The calling code's BundleContext could not be determined.
    at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:46)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.init(InitialContext.java:242)
    at javax.naming.InitialContext.<init>(InitialContext.java:192)
Run Code Online (Sandbox Code Playgroud)

问题:这是正确的行为,还是我可以参考的规范中有一部分违反了此限制?

java osgi jndi apache-karaf aries

14
推荐指数
1
解决办法
2559
查看次数

如何为Apache Karaf设置代理

简单的一个但无法在谷歌上找到任何可靠的东西.我正在经营卡拉夫,我在代理人后面.我需要通过执行以下命令向容器添加一些功能:

features:addurl mvn:org.apache.camel.karaf/apache-camel/2.9.0/xml/features
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到以下异常:

Could not add Feature Repository:
java.lang.RuntimeException: URL [mvn:org.apache.camel.karaf/apache-camel/2.9.0/xml/features] could not be resolved.
Run Code Online (Sandbox Code Playgroud)

这似乎是代理身份验证问题.请注意我已经向Maven添加了代理信息,我可以在Maven中下载依赖项.我怀疑我需要将一些信息如http.proxyName或http.Proxyxxx添加到Karaf安装的etc目录中的一个文件中.

有什么想法吗?

更新:我在org.ops4j.pax.url.mvn.cfg中找到了一个设置,

org.ops4j.pax.url.mvn.proxySupport=true 
Run Code Online (Sandbox Code Playgroud)

我已经取消注释,但我仍然无法进行身份验证.所以我怀疑我需要在某个地方设置我的maven主文件夹.

更新2:好的很简单:

在您的Apache karaf文件夹中有一个etc文件夹.编辑org.ops4j.pax.url.mvn.cfg文件.您需要执行两个步骤才能工作.

  • 将karaf指向您的maven安装:在cfg文件中找到以下字符串org.ops4j.pax.url.mvn.settings取消注释并添加您的maven主路径,即org.ops4j.pax.url.mvn.settings =/maven /的conf/settings.xml中
  • 告诉karaf使用maven代理设置:在cfg文件中找到以下字符串org.ops4j.pax.url.mvn.proxySupport取消注释,如果需要,则将其设置为true,即org.ops4j.pax.url.mvn.proxySupport =真

我重新启动了Karaf,我现在可以下载/安装功能了.我希望有一天能帮助别人.

proxy maven apache-karaf

13
推荐指数
2
解决办法
1万
查看次数

OSGi和传递依赖

我在我的OSGi项目中使用了Felix Framework,但是我遇到了一个关于第三方依赖的严重问题.

我正在使用eclipse和maven-bundle-plugin从源代码生成我的bundle,从POM.XML文件生成MANIFEST.MF.到现在为止还挺好.然而,当我在我的包中有一些第三方依赖时,我发现自己正在寻找一个无限的JAR列表,它们通常不是捆绑包,并将它们放在我的/ bundle Felix目录中,直到不再缺少依赖项为止.

我将此过程称为"下载Internet以使我的OSGi应用程序正常工作".

我究竟做错了什么?当然,我必须做一些非常错误的事情,因为我无法想象任何人有一个依赖于B的捆绑A,然后依赖于C和D,然后这两个将取决于其他几个等等......去寻找所有这些依赖关系手动使用谷歌或maven中央!那太疯狂了!

什么是自动化的正确方法?我希望有两种解决方案之一:

1)能够创建一个嵌入了所有依赖项的大型JAR文件,但只导出我想要的包,而且只导出corse,而不是导入任何包.

2)(我的首选解决方案)有办法将我的所有依赖项都放到单独的JAR文件中,我可以简单地粘贴到/ bundle目录中.

3)(甚至更优选)有一种方法可以使用第三方JAR而无需将8GB的依赖项下载到我的项目中.

我找到了这样做的工具,但仅用于直接(1度)依赖关系,为我提供了传递依赖关系以便手动解决.

这个问题至关重要.缺少这样的工具会妨碍OSGi的使用.我搜索,搜索和搜索,我遇到了所有101种解决方案,如PAX,bndtools和朋友,但似乎他们没有解决这个问题......

请帮我.请提供一个活生生的例子,如果可以的话,世界各地的人都会从这个问题的解决方案中受益.

谢谢!

-

-

编辑:我附加了一个示例项目,我正在尝试使用JScience,但生成的JAR包不断询问我新的Imports,即它不是自包含的.

链接到示例:https://www.dropbox.com/s/svo3nu3vawvv2xn/RequireJscienceExample.zip?dl=0

我通常尝试使用Eclipse将第三方JAR转换为捆绑包,但它们总是必须导入我没有的包,所以这是一个无休止的情况,如你所说.

我找不到任何关于maven-bundle-plugin标签Conditional_Package的文档.但是相关的搜索显示我之前尝试过的内联选项没有成功.

我创建了一个基本项目,其中我有一个使用JScience库的类,在其POM.XML中我有以下内容:

<plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId};singleton:=true
                        </Bundle-SymbolicName>
                        <Bundle-Version>${project.version}</Bundle-Version>
                        <Export-Package>shared.properties.api, shared.properties.base
                        </Export-Package>
                        <Embed-Dependency>!org.osgi.*;scope=compile|runtime;inline=true</Embed-Dependency>
                        <Embed-Transitive>true</Embed-Transitive>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
            </plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)

我说maven要内联所有不是来自osgi框架本身的包.看看生成的JAR看起来相当不错,我现在只嵌入了包而不是整个JAR(但是我认为我不需要所有那些内联包,因为我只使用其中两个).此外,如果我打开MANIFEST.MF文件,我可以看到这个有问题的行:

Manifest-Version: 1.0
Bnd-LastModified: 1414164534170
Build-Jdk: 1.6.0_65
Built-By: Pedro
Bundle-ManifestVersion: 2
Bundle-Name: RequireJscienceExample
Bundle-SymbolicName: RequireJscienceExample;singleton:=true
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: !org.osgi.*;scope=compile|runtime;inline=true …
Run Code Online (Sandbox Code Playgroud)

pax-runner apache-felix apache-karaf maven-bundle-plugin bndtools

13
推荐指数
1
解决办法
2835
查看次数

Apache Camel条件路由

我有一项服务,有两个操作.

RegisterUser
UpdateUser
Run Code Online (Sandbox Code Playgroud)

我有一个骆驼溃败:

<camel:route id="myRoute">
    <camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />            
    <camel:bean ref="processor" method="processMessage"/>
    <camel:to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
    <camel:to uri="cxf:bean:myTargetEndpoint"/>
</camel:route>
Run Code Online (Sandbox Code Playgroud)

在我的处理器bean中,当我指定:

RegisterUser registerUser = exchange.getIn().getBody(RegisterUser.class);
Run Code Online (Sandbox Code Playgroud)

我得到了注册用户对象.一切正常.问题是我希望camel有条件地路由我的请求,例如:

如果服务操作是RegisterUser我想将消息路由到我的特定bean,如果服务操作是UpdateUser我想将消息路由到另一个bean.

我曾尝试使用camel xPath,但它似乎没有用.

<camel:route id="myRoute">
    <camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />  
    <camel:choice>
        <camel:when>
            <camel:xpath>
                //RegisterUser
            </camel:xpath>
            <camel:bean ref="processor" method="processMessage"/>
            <camel:to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
        </camel:when>
    </camel:choice>                        
    <camel:to uri="cxf:bean:myTargetEndpoint"/>
</camel:route>
Run Code Online (Sandbox Code Playgroud)

我正在寻找如何设置骆驼路线到不同的目标,但没有找到任何东西.也许有人知道问题出在哪里?

java routing cxf apache-camel apache-karaf

10
推荐指数
2
解决办法
3万
查看次数

在Apache Karaf下设置Java堆大小

如果这是重复的话,我道歉,但我似乎无法在任何地方找到答案.

使用Apache Karaf时增加最大Java堆大小的最佳方法是什么?

目前,我修改了karaf.bat文件中的以下行:

set DEFAULT_JAVA_OPTS=-server -Xmx<NewMaxValue>M.

我觉得修改bat文件不是最好的解决方案.此外,没有一个配置文件似乎有地方放这个.

谢谢

java heap apache-karaf

9
推荐指数
2
解决办法
2万
查看次数

如何使用maven项目轻松部署到Karaf Osgi容器

我正在开发一个OSGI包,用于使用PDFBox库解析PDF文件.我使用maven构建项目,使用Karaf作为OSGI容器.PDFBox库与OSGI兼容,所以我认为这很容易.但我无法正确获得部署模型.

在传统的Web应用程序中,我将构建一个包含所有依赖项的WAR文件,并将其放在Servlet容器中,然后部署它.另一方面,我想出如何安装osgi包的唯一方法是手工完成.我必须创建一个安装指令文件,列出必须手动下载并复制到Karaf部署文件夹的所有依赖项,并确保按正确的顺序执行.我觉得自己又回到了石器时代.

必须有一个更简单的方法,对吧?我仍然使用maven来声明依赖项,但我只需要使用提供的范围.如果可以自动安装这些依赖项,那将会很棒.

我正在使用maven-bundle-plugin从我的应用程序生成一个包.它确实生成了一个OBR存储库(repository.xml),我尝试使用obr karaf插件安装我的软件包,但它仍然无法帮助依赖.

osgi maven apache-karaf karaf karaf-maven-plugin

9
推荐指数
1
解决办法
6673
查看次数

从码头到绝对URL的骆驼路线

OSGi部署了一个捆绑包Apache Karaf.我有一个简单的骆驼路线:

    <camelContext trace="true" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="jetty:http://0.0.0.0:8282/services?handlers=securityHandler&amp;matchOnUriPrefix=true"/>
            <setHeader headerName="CamelHttpQuery">
                <constant>wt=xml&amp;rows=1000000&amp;fl=nid,title&amp;fq=sm_vid_Third_parties_with_which_this_organisation_s_content_can_be_shared:%22Indeed%22</constant>
            </setHeader>
            <to uri="http://172.28.128.158:8983/solr/targetjobs.co.uk.gtimedia.test/select/?"/>

<!--        <split>
                <xpath>//int[@name='nid']</xpath>
            </split>-->
            <convertBodyTo type="java.lang.String" />
        </route>
    </camelContext>
Run Code Online (Sandbox Code Playgroud)

我无法让它发挥作用.当我调用http://localhost:8282/services它时应该路由到uri下面指定的setHeader.相反,我得到这个例外:

java.lang.IllegalArgumentException:无效的uri:/ services.如果要转发/桥接http端点,则在端点上启用bridgeEndpoint选项:Endpoint [ http://172.28.128.158:8983/solr/targetjobs.co.uk.gtimedia.test/select/]

它说我需要启用桥接端点,但这不是端点,它是我试图指向我的路由的绝对URL.

我试图设置Spring如此处所示,但这也不起作用.我也试图改变这个:

<to uri="http://172.28.128.158:8983/solr/targetjobs.co.uk.gtimedia.test/select/?"/>
Run Code Online (Sandbox Code Playgroud)

对此:

<to uri="jetty//http://172.28.128.158:8983/solr/targetjobs.co.uk.gtimedia.test/select/?"/>
Run Code Online (Sandbox Code Playgroud)

也没有成功.也许有人知道如何从jetty uri绝对路线url

java routing osgi apache-camel apache-karaf

7
推荐指数
1
解决办法
8656
查看次数

脚本Karaf shell命令?

我需要以非交互方式发出Karaf shell命令,最好是从脚本中发出.更具体地说,我需要以feature:install自动方式告诉Karaf 一系列功能.

# Attempt to install a feature in a way I could script
bash> bin/karaf feature:install myFeature
# Drops me into Karaf shell
karaf> feature:uninstall myFeature
Error executing command: Feature named 'myFeature' is not installed
# Feature wasn't installed
Run Code Online (Sandbox Code Playgroud)

这可能吗?是否有一种不同的解决方法(自动安装一套Karaf功能)我不知道?

shell scripting apache-karaf karaf

7
推荐指数
3
解决办法
6966
查看次数

无法找到Kafka Producer - org.apache.kafka.common.serialization.StringSerializer

我创建了一个简单的Kafka Producer&Consumer.我使用的是kafka_2.11-0.9.0.0.这是我的制作人代码,

public class KafkaProducerTest {
public static String topicName = "test-topic-2";
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("acks", "all");
    props.put("retries", 0);
    props.put("batch.size", 16384);
    props.put("linger.ms", 1);
    props.put("buffer.memory", 33554432);
    props.put("key.serializer",
            StringSerializer.class.getName());
    props.put("value.serializer",
            StringSerializer.class.getName());

    Producer<String, String> producer = new KafkaProducer(props);
    for (int i = 0; i < 100; i++) {
        ProducerRecord<String, String> producerRecord = new ProducerRecord<String, String>(
                topicName, Integer.toString(i), Integer.toString(i));
        System.out.println(producerRecord);
        producer.send(producerRecord);
    }

    producer.close();
}

}
Run Code Online (Sandbox Code Playgroud)

在启动捆绑ia时遇到以下错误,

2016-05-20 09:44:57,792 | …
Run Code Online (Sandbox Code Playgroud)

apache-karaf apache-kafka apache-spark spark-streaming-kafka

7
推荐指数
3
解决办法
1万
查看次数

通过Camel Blueprint中的属性配置SQL数据源(在Karaf中)

给出了一个非常简单的Camel捆绑包,用于生成camel-archetype-blueprint,我希望添加一个通过属性而不是在属性中配置的数据源blueprint.xml.

我尝试以各种方式配置PropertiesComponent并访问propertyMySQL数据源的值中的属性,但似乎没有一个工作.记录消息时,可以访问属性.

如何使用属性文件中的参数值配置数据源?

我特别需要这个,为多个bundle使用相同的数据源配置,并区分生产/测试环境.我考虑过在构建过程中使用Maven编写属性,具体取决于目标环境.有关如何解决此数据源问题的其他最佳实践吗?

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
        <property name="location" value="classpath:config.properties" />
    </bean>

    <bean id="dataSourceMySQL" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
        <property name="url" value="jdbc:mysql://127.0.0.1/test_database" />
        <!-- This causes an error, as it tries to connect with
             `${mysqlUser}`@`localhost` without any evaluation -->
        <property name="user" value="${mysqlUser}" />
        <property name="password" value="${mysqlPassword}" />
    </bean>

    <service interface="javax.sql.DataSource" ref="dataSourceMySQL">
        <service-properties>
            <entry key="osgi.jndi.service.name" value="jdbc/mysqlDatasource" />
        </service-properties>
    </service>
    <bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
        <property name="dataSource" ref="dataSourceMySQL" />
    </bean> …
Run Code Online (Sandbox Code Playgroud)

java datasource apache-camel blueprint apache-karaf

7
推荐指数
1
解决办法
4604
查看次数