myeclipse 是一个比 eclipse 整合更好的工具,非常的适合开发人员使用, 但是在使用的过程中也遇到一些问题。例如 myeclipse中的derby集成后,只能修改 端口 和数据库的保存路径,而把地址的绑定给限定死了,只能的localhost,也就是无法让其他人访问这个数据库,除了本机。 不知道是不是myeclipse的有意为之还是编码的不小心。 其实在eclipse中集成的 derby数据库服务 : 在多个网卡的情况下,地址可以绑定任意网卡或者绑定在 0.0.0.0 即所有网卡上监听。
本着研究和改进的建议,对myeclipse进行了一次小小的分析。
在对网站进行了苦苦的搜索之后,没有发现任何这个问题的解决办法,处于无奈,对myeclipse进行了粗暴的反编译处理。
搜先准备工具 DJ 是要的,还有就是 myeclipse 自身。
其一、发现myeclipse是怎么启动 derby的网络服务的。 根据eclipse的osgi的思想,我们能够非常快的定位到,myeclipse的启动代码位置:
$myeclipserootMyEclipse6/myeclipse/eclipse/plugins/com.genuitec.eclipse.derby_6.0.1.zmyeclipse601200710/
在这个目录下面的class进行反编译,快就定位到了是那个代码启动derby。
我们可以很容易在com.genuitec.eclipse.derby.DerbyUtil发现这样一段代码:
public static Launch getDerbyLaunch(boolean start)
throws IllegalStateException, CoreException
{
String homeDir = getHomeDir();
// 0 0:invokestatic #415 <Method java.lang.String com.genuitec.eclipse.derby.DerbyUtil.getHomeDir()>
// 1 3:astore_1
int port = getPort();
// 2 4:invokestatic #411 <Method int com.genuitec.eclipse.derby.DerbyUtil.getPort()>
// 3 7:istore_2
String nArgs[] = new String[5];
// 4 8:iconst_5
// 5 9:anewarray java.lang.String[]
// 6 12:astore_3
nArgs[0] = start ? DerbyConstants.START_DERBY_SERVER : DerbyConstants.SHUTDOWN_DERBY_SERVER;
// 7 13:aload_3
// 8 14:iconst_0
// 9 15:iload_0
// 10 16:ifeq 25
// 11 19:getstatic #394 <Field java.lang.String com.genuitec.eclipse.derby.DerbyConstants.START_DERBY_SERVER>
// 12 22:goto 28
// 13 25:getstatic #393 <Field java.lang.String com.genuitec.eclipse.derby.DerbyConstants.SHUTDOWN_DERBY_SERVER>
// 14 28:aastore
nArgs[1] = "-h";
// 15 29:aload_3
// 16 30:iconst_1
// 17 31:ldc2 #202 <String "-h">
// 18 34:aastore
nArgs[2] = "localhost";
// 19 35:aload_3
// 20 36:iconst_2
// 21 37:ldc2 #215 <String "localhost">
// 22 40:aastore
nArgs[3] = "-p";
// 23 41:aload_3
// 24 42:iconst_3
// 25 43:ldc2 #203 <String "-p">
// 26 46:aastore
nArgs[4] = Integer.toString(port);
// 27 47:aload_3
// 28 48:iconst_4
// 29 49:iload_2
// 30 50:invokestatic #444 <Method java.lang.String java.lang.Integer.toString(int)>
// 31 53:aastore
String vmArgs[] = (String[])null;
// 32 54:aconst_null
// 33 55:checkcast #217 <Class java.lang.String[]>
// 34 58:astore 4
if(!Util.isNullOrEmpty(homeDir))
//* 35 60:aload_1
//* 36 61:invokestatic #405 <Method boolean com.genuitec.eclipse.core.util.Util.isNullOrEmpty(java.lang.String)>
//* 37 64:ifne 94
{
vmArgs = new String[1];
// 38 67:iconst_1
// 39 68:anewarray java.lang.String[]
// 40 71:astore 4
vmArgs[0] = (new StringBuilder("-Dderby.system.home=")).append(homeDir).toString();
// 41 73:aload 4
// 42 75:iconst_0
// 43 76:new #238 <Class java.lang.StringBuilder>
// 44 79:dup
// 45 80:ldc2 #201 <String "-Dderby.system.home=">
// 46 83:invokespecial #451 <Method void StringBuilder(java.lang.String)>
// 47 86:aload_1
// 48 87:invokevirtual #453 <Method java.lang.StringBuilder java.lang.StringBuilder.append(java.lang.String)>
// 49 90:invokevirtual #450 <Method java.lang.String java.lang.StringBuilder.toString()>
// 50 93:aastore
}
return JavaVMUtility.execute(DerbyConstants.DERBY_SERVER_CLASS, derbyCP, vmArgs, nArgs, DerbyCore.getDefault().getStateLocation().toString(), null, false, DerbyServer.DEFAULT_INST_ID, null, false);
// 51 94:getstatic #391 <Field java.lang.String com.genuitec.eclipse.derby.DerbyConstants.DERBY_SERVER_CLASS>
// 52 97:getstatic #396 <Field java.lang.String[] com.genuitec.eclipse.derby.DerbyUtil.derbyCP>
// 53 100:aload 4
// 54 102:aload_3
// 55 103:invokestatic #406 <Method com.genuitec.eclipse.derby.DerbyCore com.genuitec.eclipse.derby.DerbyCore.getDefault()>
// 56 106:invokevirtual #407 <Method org.eclipse.core.runtime.IPath com.genuitec.eclipse.derby.DerbyCore.getStateLocation()>
// 57 109:invokeinterface #475 <Method java.lang.String org.eclipse.core.runtime.IPath.toString()>
// 58 114:aconst_null
// 59 115:iconst_0
// 60 116:getstatic #395 <Field java.lang.String com.genuitec.eclipse.derby.DerbyServer.DEFAULT_INST_ID>
// 61 119:aconst_null
// 62 120:iconst_0
// 63 121:invokestatic #403 <Method org.eclipse.debug.core.Launch com.genuitec.eclipse.core.JavaVMUtility.execute(java.lang.String, java.lang.String[], java.lang.String[], java.lang.String[], java.lang.String, org.eclipse.jdt.launching.IVMInstall, boolean, java.lang.String, org.eclipse.debug.core.model.ISourceLocator, boolean)>
// 64 124:areturn
}
看到那段红色的 localhost 了吗,真是应为代码中写死了,所以无论你怎么配置都没有办法改变ip地址,只要localhost 换成 ‘0.0.0.0’即可。
修改完成编译,然后替换这个class 文件,同时修改 原来的 MANIFEST.MF 中签名的信息。
至此,我们就完成了对这个问题修改工作。
附件为 myeclipse6.0 中的derby的替换rar 包。
附件在我空间资源中找 -- http://jackychen_king.download.youkuaiyun.com/
本文介绍如何解决MyEclipse中Derby数据库服务仅能绑定到localhost的问题,通过反编译和修改源代码,实现将服务绑定到任意IP地址。

被折叠的 条评论
为什么被折叠?



