我正在使用 Java JDK 1.6、Windows XP SP3 开发 Eclipse STS 2.7.2。我在需要身份验证的代理后面工作。
我编写了两个简单的客户端和服务器插件,它们使用 DS 和 Zookeeper 发现。它们指的是捆绑在第三个插件中的 IHello 接口。
服务器发布一个简单的 Hello 服务,当在 192.16.23.28:6666/hello 上调用时返回一个字符串“hello”并使用 VM 参数启动 Zookeper
-Dzoodiscovery.dataDir=bla
-Dzoodiscovery.flavor=zoodiscovery.flavor.standalone=192.168.23.28:3030;clientPort=3031
xml 是:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="NOLINKALLOWED" name="it.eng.test.remote.ds.helloservice">
<implementation class="it.eng.test.remote.ds.helloservice.HelloService"/>
<property name="service.exported.interfaces" type="String" value="*"/>
<property name="service.exported.configs" type="String" value="ecf.generic.server"/>
<property name="ecf.exported.containerfactoryargs" type="String" value="ecftcp://192.168.23.28:6666/hello"/>
<service>
<provide interface="it.eng.test.remote.ds.hello.IHello"/>
</service>
</scr:component>
客户端使用 VM 参数启动 Zookeeper
-Dzoodiscovery.autoStart=true
-Dzoodiscovery.flavor=zoodiscovery.flavor.standalone=192.168.23.28:3031;clientPort=3030
在这两种情况下,OSGi 框架都是从-console -consoleLog -clean
参数开始的。
然后,我为服务器和客户端创建了两个单独的运行配置(运行方式->运行配置..),添加了所有必需的包(最重要的包:org.eclipse.ecf.provider.remoteservice
和org.eclipse.ecf.provider.zookeeper
)及其依赖项。
基于该配置,我为客户端和服务器定义了两个独立的产品配置(新建->产品定义->选择运行配置)。
现在,如果我通过单击相应产品配置中的“启动 Eclipse 应用程序”链接来运行它们,一切正常。服务器发布服务,客户端获取它并在输出中显示“Hello”。netstat -a | grep 6666
显示有人正在监听该端口,并netstat -a | grep 30
显示正在使用端口 3030 和 3031。
Eclipse 已配置为正确使用我的代理。
如果我根据上述配置将它们导出为 Eclipse 产品(export->eclipse product->select product configuration),我会得到两个文件夹:client 和 server。
在它们内部,有在外部 OSGi 框架内运行应用程序所需的一切,包括框架 ( config.ini
) 和 VM ( eclipse.ini
) 的配置文件。
应用程序启动时STS.exe -console
会打开一个 OSGi 控制台,其中安装并启动了所有必需的包。
启动服务器工作,我看到有人在 6666 上监听,zookeeper 报告该服务已发布。
如果我启动客户端,什么都不会发生。没有输出,3030 和 3031 上没有连接,没有错误。它根本什么都不做,但是动物园管理员说它已经开始发现了。
使用 localhost 而不是我的 IP 没有任何改变,它仍然可以在 Eclipse 内部工作,但不能在外部工作。