Java开发学习之道:Java开源项目源码阅读方法及二次开发方法

一直以来,都想要阅读某些Java开源项目的源代码,甚至想要修改某些代码,实现对开源项目进行二次开发的目的。但总是不知从何入手,直接将开源项目的源代码导入Eclipse,总是会报很多错误,而无法编译。可以直接通过Eclipse打开开源项目的源代码,至少能够达到可视化源码阅读、源码导航的目的,还是能在一定程度上解决源码阅读不爽的问题,因为直接打开并没有改变源文件项目的目录结果,对于修改过后的代码,可以通过命令行找到源文件项目目录,并使用mvn或者ant对项目进行编译,再查看修改后的项目是否正确。


由于当前Java开源项目几乎都是采用maven或者ant的方式打包的,所以上述方法再一定程度上解决了阅读源码的问题,至少通过Eclipse能够实现源码之间的导航,但是想要通过Eclipse进行编译源代码,甚至调试就无法办到了。


这么强大的Eclipse,怎么用起来这么力不从心呢,罪魁祸首还是自己太孤陋寡闻了,这么强大的maven,Eclipse怎么会没有插件支持呢,有了maven插件,Eclipse导入maven项目(也就是大多数开源项目的目录结构),在Eclipse上面就能够直接进行编辑,甚至通过Eclipse去编译、调试源项目。


既然知道了怎样阅读开源项目的源代码,接下来就是安装Eclipse的maven插件,然后源代码、二次开发...


前面说了这么多废话,是否真的有效呢,下面以Axis2源代码为例,做一个小实验例子,修改services/listServices请求的处理源码,使得原先仅支持WSDL方式描述的Web服务现在也支持OWL4WS的Web服务描述。


第一步:安装maven

安装maven实在是简单,从 http://maven.apache.org/download.html 下载最新的maven版本,然后解压,配置MAVEN_HOME和MAVEN_OPTS以及path环境变量即可。MAVEN_HOME指向maven的跟目录,MAVEN_OPTS配置maven执行时的参数,由于MAVEN默认设置的内存比较少,编译大项目时可能会出现OutofMemory的情况,如我没有设置MAVEN_OPTS而编译Axis2的源码时就出现了OutofMemory的情况,最后配置path,指向%MAVEN_OPTS%\bin即可。使得在命令行界面中能够直接使用maven命令。更多关于maven的介绍,推荐一本书给大家:《Maven实战》,也有叫《Maven in action》,是一个中国人写的,浅显易懂。


第二步:安装Eclipse的maven插件

Help->Install New Software->Add,添加如下内容:

m2e - http://download.eclipse.org/technology/m2e/releases

如 http://www.eclipse.org/m2e/download/ 所示,上述插件的路径应该为m2e的最新版本,使用之前的版本可能会出现依赖其他插件的情况,导致m2e插件安装不上,SB的Eclipse也没有提示m2e到底依赖哪些插件导致其安装不上,度娘倒是能够提供一下帮助,但是几乎不能找到一个能够使用的。

安装完m2e插件之后,就能通过Eclipse打开maven格式的项目,并能够借助Eclipse对maven格式的源项目进行编译,当然也可以直接通过Eclipse创建一个Maven项目,从而使用maven的方式管理你的项目。maven实在是强大,如果你使用Java语言写程序,了解maven真心是有必要。安装完后再创建项目或者导入项目时,就可以选择Maven进行了。安装完插件后会看到如下效果:



第三步:在Eclipse中修改源代码

通过Eclipse导入maven项目,就能使用Eclipse的可视化导航功能对源码进行阅读及修改,还能直接执行相关的mvn命令,导入后的程序如下图所示:



第四步:通过mvn package编译并打包源码,得到发行版本,进行测试

有了maven,源代码的编译及打包就变得容易多了,可以直接通过Eclipse进行,选择项目右键Run As或者右键单击项目的pom.xml文件Run As即可。如下图所示:



当然,也可以直接通过命令行进行打包编译,我选择采用命令行进行,由于我只修改了Axis2源码中的两个模块,这两个模块分别是axis2-transport-http和axis2-webapp。对这两个模块的命令行编辑命令如下:

[plain]  view plain copy print ?
  1. C:\OpenSource\axis2-1.6.0-src\axis2-1.6.0\modules\transport\http>mvn clean install  
  2. [INFO] BUILD SUCCESS  
  3.   
  4. C:\OpenSource\axis2-1.6.0-src\axis2-1.6.0\modules\webapp>mvn clean package  
  5. [INFO] Building war: C:\OpenSource\axis2-1.6.0-src\axis2-1.6.0\modules\webapp\target\axis2.war  
  6. [INFO] BUILD SUCCESS  

mvn install是将axis2-transport-http模块安装到maven本地仓库中,而mvn package是将源程序按指定的格式打包,由于webapp模块的pom.xml文件中指定了很多依赖模块,包括其他项目的或者axis2本身的模块,如transport-http模块,打包时会从本地仓库中自动获取其依赖的模块,并打包。如果本地仓库中没有相应的模块,会去网上自动下载,这也是为什么第一次编译开源项目时会花费很长时间的原因。


将axis2.war包拷贝到tomcat的webapp目录下,启动tomcat,在浏览器中输入http://localhost:8080/axis2/services/listServices,即可看到修改后的页面已经对OWL4WS进行了支持。如下图所示:



回过头来,发现本篇文章尽是废话,不过就是想表达一下,maven真心是灰常强大,对于想要阅读Java开源项目源代码,或者有在这些源代码的基础上进行二次开发冲动的童鞋,一定不要错过maven的学习,不过感觉这种方式在修改源代码,然后进行测试这种方式还是非常不方便,命令行编译,还得copy到tomcat下测试运行,哪位有更好的阅读源代码并进行二次开发的方式,请你一定要告诉我啊。

java完整项目,实现良好,图形界面 具体函数的实现: 首先进入航空公司系统之后,通过run函数的调用选择自己的身份(用户、预订代理、管理员和VIP)。 如果选择普通用户则进入clientRun()函数中,用户可选择预留票、购买票、购买预留票、申请VIP、买电子票或者退出。若选择预留票则进入bookTicket()函数,可根据用户的输入信息进行判断信息是否匹配,如果是第一次登陆,则系统会要求用户先进行注册用户信息然后再买票。如果已选好航班要支付机票时,则调用payClientTicket()函数对输入的航班信息通过遍历FlightDataBase.txt文件查找匹配的数据,再将用户买票的情况以及机票的可获得性,用户的余额等信息写入对应的文件中,通过调用ClientDatabae类中的getTicket()函数来实现支付票功能。如果用于选择购买预留票,则通过调用buyLeftTicket()函数来实现,也是调用getTicket()来实现。申请VIP可将输入信息写入ClientDataBase.txt文件中并且如果该用户已经存在,那么原来的信息将被覆盖,如果原来没有该用户,那么将新建一个VIP,同样,如果用户想购买电子票,那么其他流程和购买机票一样,只是系统会给用户一个随机的检票码来供用户在通过检票口的时候使用。 若是VIP登陆,VIP作为Client的子类。 如果以管理员的身份登录则调用adminRun()函数,那么可以查看所有用户和代理的信息,以及对代理的添加与删除,还可以查看余票信息。通过对文件的读取来查看信息,通过对数据文件的写入来增加addAgent()或删除deleteAgent()代理。 如果一代理人的身份登录要调用agentRun()函数,通过对数据文件的读取来获取航班信息,预留客户信息,预订客户信息,普通用户与VIP的信息。通过对FlightDataBase的写入来增加航班。
Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值