如何绕过karaf中的默认aries jndi查找

Posted

技术标签:

【中文标题】如何绕过karaf中的默认aries jndi查找【英文标题】:How to bypass default aries jndi lookup in karaf 【发布时间】:2018-08-06 21:06:06 【问题描述】:

我正在尝试在作为 osgi 包的一部分部署在 servicemix (karaf) 中的代码中查找 connectionFactory

final Hashtable<String, Object> jndiContext = new Hashtable<String, Object>();
jndiContext.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
jndiContext.put(Context.SECURITY_AUTHENTICATION, "none");
jndiContext.put(Context.PROVIDER_URL, pJndiLDAPserver);
ctx = new InitialContext(jndiContext);
ConnectionFactory lResult = (ConnectionFactory) ctx.lookup(pJndiCFname);

我面临的问题是-

    当我执行 ctx.lookup("xyz") 时 - 它给了我一个 javax.naming.Reference 对象,而不是 MQconnectionFactory。 (同样的代码可以作为独立的 Java 应用程序完美运行) 另外,ctx = new InitialContext(jndiContext) 给了我一个 InitialContext 对象,其中 defaultInitContext 为 - org.apache.aries.jndi.DelegateContext。理想情况下,它应该给我 defaultInitiContext 作为 LdapCtx(因为我的提供程序 url 是一个 Ldap 服务器)

我的 pom.xml 中有以下依赖项 -

    <dependency>
        <groupId>javax.jms</groupId>
        <artifactId>javax.jms-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.mq.osgi</groupId>
        <artifactId>java</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.msg.client.osgi.jms</groupId>
        <artifactId>prereq</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.msg.client.osgi</groupId>
        <artifactId>jms</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.msg.client.osgi.commonservices</groupId>
        <artifactId>j2se</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.mq.osgi</groupId>
        <artifactId>allclient</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.mq.osgi</groupId>
        <artifactId>allclientprereqs</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.msg.client.osgi</groupId>
        <artifactId>nls</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.msg.client.osgi.wmq</groupId>
        <artifactId>nls</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.msg.client.osgi.wmq</groupId>
        <artifactId>prereq</artifactId>
        <version>9.0.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.msg.client.osgi</groupId>
        <artifactId>wmq</artifactId>
        <version>9.0.0.0</version>
    </dependency> 
    <dependency>
        <groupId>com.csg.npms.pilatus</groupId>
        <artifactId>pilatus-common</artifactId>
        <version>0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.ops4j.pax.logging</groupId>
        <artifactId>pax-logging-api</artifactId>
        <version>1.8.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>4.3.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0-m09</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.1.4</version>
        <scope>provided</scope>
    </dependency>

并且相同的 com.ibm 依赖项已作为 karaf 包的一部分安装。

因此,关于第 2 点,我如何绕过 Karaf (org.apache.aries.jndi.DelegateContext) 中的默认 jndi aries 查找,以便它给我 LdapContextFactory 对象而不是 DelegateContext。作为 karaf 中 mq 的一部分,我是否缺少任何罐子。

【问题讨论】:

您在 karaf 中安装了哪些功能?该错误表明您尚未安装 jms api。通常,当您安装 ActiveMQ 等 jms 客户端时会安装此 API。 @rollstuhlfahrer ..您将 Q 推为“需要编辑”...您能否帮助 OP 指出正确的方向缺少什么或自己更改? (ps:不需要回复我因为/我什至不是这个话题的初学者)。 @ChristianSchneider - 我已经在 karaf 中安装了 jndi 和 jms 功能。主要问题是 osgi 包无法在其路径上找到 ibm mq 和 javax 类。 IBM MQ 可能有点难以开始工作。我最后一次尝试它花了我相当大的努力。我读到 IBM 在某个时候开始生产捆绑软件 .. 所以我希望现在更容易,但我没有更新的经验。 【参考方案1】:

这是错误的关键部分:

Unresolved requirements: [[org.apache.qpid.jms.client [464](R 464.8)] osgi.wiring.package; (&(osgi.wiring.package=javax.jms (version>=1.1.0)(!(version>=2.0.0)))

这表示无法解析名为 org.apache.qpid.jms.client 的包,因为它导入了包 javax.jms,但没有其他包导出包 javax.jms。在 OSGi 中,每个导入都必须与该包的导出相匹配。此外还有一个版本限制:您需要版本 [1.1.0, 2.0.0),即至少 1.1.0 但小于 2.0.0。

我建议使用来自 Maven Central 的以下捆绑包:https://search.maven.org/#artifactdetails%7Corg.jboss.spec.javax.jms%7Cjboss-jms-api_1.1_spec%7C1.0.1.Final%7Cjar。

【讨论】:

嗨,尼尔...您提到的上述 maven 包解决了此版本错误,但随后找不到任何 ibm mq jar。即 MQConnectionFactory mq = new MQConnectionFactory() 现在给出(一些 java 链接)异常。我面临的问题是这些 javax-jms 和 ibm mq jar 如何与 osgi 包集成在一起工作。如果 osgi 能够正确找到这些 jar 和类,它将永远不会在查找连接工厂时返回我的引用对象 查看此链接。 developer.ibm.com/messaging/2018/01/09/… 即使这样也没有用! :( 有人对 karaf 和 mq jars 进行集成吗?急需帮助!! 我已经编辑了这个问题。谁能帮忙。【参考方案2】:

虽然我不知道如何绕过 karaf 中的默认 jndi 查找,但我自己目前正在努力解决这个问题,试图弄清楚如何让它使用我需要的初始上下文工厂,我能够要通过蓝图中的 bean 直接实例化 MQ 连接工厂来使其工作,然后您可以命名它并从 jndi 将其作为普通服务引用,如下所示:

 <bean id="wmqcf"  class="com.ibm.mq.jms.MQQueueConnectionFactory">
     <property name="hostname" value="my.host">
     ...port, channel, queue manager, etc ...
</bean>

<service interface="javax.jms.ConnectionFactory" ref="wmqcf">
    <service-properties>
       <entry key="osgi.jndi.service.name" value="jms/wmqcf">
    </service-properties>
</srevice>

这样您就无需担心任何桥接、池等。只是在您的应用程序中为 wmq 获取连接工厂的快速方法。

【讨论】:

以上是关于如何绕过karaf中的默认aries jndi查找的主要内容,如果未能解决你的问题,请参考以下文章

关闭 Apache Aries 的默认网页

使用Log4J 2查找JNDI变量查找时如何设置默认值?

[Java安全]JDK8u191之后的JNDI注入绕过(javax.el.ELProcessor依赖)

[Java安全]JDK8u191之后的JNDI注入绕过(javax.el.ELProcessor依赖)

如何从 Web 容器外部查找 JNDI 数据源?

[Java安全]绕过高版本JDK的JNDI注入学习