关于集成在myeclipse中derby不能使用 0.0.0.0 地址的问题。

本文介绍如何解决MyEclipse中Derby数据库服务仅能绑定到localhost的问题,通过反编译和修改源代码,实现将服务绑定到任意IP地址。

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/ 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值