学习Hibernate源码一
1.下载hibernate源码,并构建起eclipse项目
(1)hibernate的源代码采用git管理,安装git客户端以后,通过点击https://github.com/hibernate/hibernate-orm页面右侧的“Clone in Desktop”可启动客户端将代码clone到本地。当然也可以直接使用
git clone git://github.com/hibernate/hibernate-orm.git
命令下载代码。
下载完毕后,打开根目录下的readme文件,可以看到详细的把源代码构建为不同IDE项目的说明;以及其他的一些信息。
对应文档的网站链接:
https://community.jboss.org/wiki/BuildingHibernateORM4x5x
构建IDE部分:
Eclipse
To create the Eclipse project files you can run
./gradlew eclipse
After changes to the dependencies you need to clean the project files and recreate them:
./gradlew cleanEclipse eclipse
See also Contributing to Hibernate using Eclipse
Idea
To create the Idea project files you can run
./gradlew idea
After changes to the dependencies you need to clean the project files and recreate them:
./gradlew cleanIdea idea
此处的gradle是hibernate所使用的自动构建工具,官网地址为:
http://www.gradle.org/
下载地址为:http://www.gradle.org/downloads,选择一个版本进行下载
此处是Hibernate团队阐述其从Maven迁移到Gradle的原因:https://community.jboss.org/wiki/GradleWhy
至于grable,有时间会深入学习一下,感兴趣的同学可以看看这位博主的博客:
http://www.blogjava.net/wldandan/archive/2012/06/26/381532.html
言归正传,下载grable后,解压,我将其解压到了C盘根目录,解压完毕的grable所在目录为:C:\gradle-1.7,将其子目录C:\gradle-1.7\bin目录加入系统的Path变量
编译代码为eclipse项目:
(1)进入hibernate源码的根目录:
cd C:\Users\Administrator\Documents\GitHub\hibernate-orm
(2)执行gradlew.bat eclipse
接着会自动下载项目所需要的依赖项,具体输出如下:
C:\Users\Administrator\Documents\GitHub\hibernate-orm>gradlew.bat eclipse
Creating properties on demand (a.k.a. dynamic properties) has been deprecated and is scheduled to be removed in Gradle 2.0. Please read http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html for information on
Deprecated dynamic property: "exportPackageVersion" on "project ':documentation'", value: "4.3.0".
Deprecated dynamic property "exportPackageVersion" created in multiple locations.
FAILURE: Build failed with an exception.
* Where:
Build file 'C:\Users\Administrator\Documents\GitHub\hibernate-orm\build.gradle' line: 85
* What went wrong:
A problem occurred evaluating root project 'hibernate-orm'.
> org/hibernate/build/gradle/publish/auth/maven/AuthenticationManager : Unsupported major.minor version 51.0
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
此时我去查看我的环境变量,JAVA_HOME指向的是64位的JDK6,将其指向32位JDK7后再次执行
gradlew.bat eclipse
发现此时gradlew又去下载了其他的依赖包,查看hibernate-rom目录下的libraries.gradle文件,可以看到hibernate的依赖包。
重新编译过程中还是报错了,具体错误:
:hibernate-core:compileJava
警告: [options] 未与 -source 1.6 一起设置引导类路径
C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\Loader.java:38: 错误: 编码GBK的不可映射字符
* @author L锟絪zl锟?Benke
^
C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\ResultCheckStyle.java:29: 错误: 编码GBK的不可映射字符
* @author L锟絪zl锟?Benke
^
C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLDelete.java:37: 错误: 编码GBK的不可映射字符
* @author L锟絪zl锟?Benke
^
C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLDeleteAll.java:37: 错误: 编码GBK的不可映射字符
* @author L锟絪zl锟?Benke
^
C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLInsert.java:37: 错误: 编码GBK的不可映射字符
* @author L锟絪zl锟?Benke
^
C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLUpdate.java:37: 错误: 编码GBK的不可映射字符
* @author L锟絪zl锟?Benke
^
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
注: 某些输入文件使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
1 个警告
google了一下,貌似是区域语言设置的问题,需要修改为“英语(英国)”,但编译并没用中断,接着编译。我将控制面板中的区域语言设置修改后,继续观察,看其是否还会报同样的错误。
最终还是失败了:
:hibernate-entitymanager:compileJava
警告: [options] 未与 -source 1.6 一起设置引导类路径
C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-entitymanager\src\main\java\org\hibernate\jpa\AvailableSettings.java:290: 错误: 编码GBK的不可映射字符
* contains 鈥淐REATE SCHEMA鈥?commands. If this property is not supplied (or is explicitly {@code false}), the
^
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
注: 某些输入文件使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
1 个警告
:hibernate-entitymanager:processResources
:hibernate-entitymanager:classes
:hibernate-testing:generateMainLoggingClasses
Download http://repo1.maven.org/maven2/com/experlog/xapool/1.5.0/xapool-1.5.0.jar
Download http://repo1.maven.org/maven2/org/jboss/jbossts/jbossjta/4.16.4.Final/jbossjta-4.16.4.Final.jar
:hibernate-testing:compileJava
警告: [options] 未与 -source 1.6 一起设置引导类路径
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
注: 某些输入文件使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
1 个警告
:hibernate-testing:processResources UP-TO-DATE
:hibernate-testing:classes
:hibernate-testing:jar
:hibernate-entitymanager:generateTestJpaMetamodelClasses
此处略去部分download信息
Download http://repo1.maven.org/maven2/org/jboss/shrinkwrap/shrinkwrap-build/1.0.0-alpha-11/shrinkwrap-build-1.0.0-alpha-11.pom
FAILURE: Build failed with an exception.
* What went wrong:
Could not resolve all dependencies for configuration ':hibernate-entitymanager:testCompile'.
> Could not resolve org.jboss.arquillian:arquillian-api:1.0.0.Alpha4.
Required by:
org.hibernate:hibernate-entitymanager:4.3.0-SNAPSHOT > org.jboss.weld.arquillian.container:arquillian-weld-ee-embedded-1.1:1.1.2.Final > org.jboss.arquillian:arquillian-spi:1.0.0.Alpha4
> Could not GET 'http://repository.jboss.org/nexus/content/groups/public/org/jboss/arquillian/arquillian-api/1.0.0.Alpha4/arquillian-api-1.0.0.Alpha4.pom'.
> The target server failed to respond
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 20 mins 17.755 secs
猜测还是和区域和语言有关,因为之前已经在控制面板修改过,重新进入hibernate-rom根目录执行gradlew.bat eclipse再次尝试编译。
又是一堆download信息后,编译开始,盯着编译的命令窗口的输出,关注其是否还会因为编码报错。
:hibernate-osgi:eclipseJdt
:hibernate-osgi:eclipseProject
:hibernate-osgi:eclipse
:hibernate-proxool:generateMainLoggingClasses
Download http://repo1.maven.org/maven2/proxool/proxool/0.8.3/proxool-0.8.3.pom
Download http://repo1.maven.org/maven2/proxool/proxool/0.8.3/proxool-0.8.3.jar
:hibernate-proxool:generateSources
:hibernate-proxool:eclipseClasspath
:hibernate-proxool:eclipseJdt
:hibernate-proxool:eclipseProject
:hibernate-proxool:eclipse
:hibernate-testing:generateSources UP-TO-DATE
:hibernate-testing:eclipseClasspath
Download http://repo1.maven.org/maven2/org/jboss/jbossts/jbossjta/4.16.4.Final/jbossjta-4.16.4.Final-sources.jar
Download http://repo1.maven.org/maven2/com/experlog/xapool/1.5.0/xapool-1.5.0-sources.jar
:hibernate-testing:eclipseJdt
:hibernate-testing:eclipseProject
:hibernate-testing:eclipse
:release:eclipseProject
:release:eclipse
BUILD SUCCESSFUL
Total time: 9 mins 13.742 secs
最终,编译成功了。
总结:
(1)编译需要使用JDK7,估计Hibernate中使用了JDK7的新特性,应该是关于try-rource的使用会比较多,接下来需要从源代码中找一下证据。
(2)需要将区域和语言修改为“英语(英国)”。
(3)编译时需要联网下载依赖项,因此网速会影响最终的编译时间。
编译完毕后导入项目到eclipse之前,先修改一下JAVA_HOME,需要和你的eclipse的版本一致,否则eclipse无法正常启动。
由于项目较多,导入的过程也会比较缓慢。需要耐心等待,如果想尝试修改hibernate源码并编译查看效果的话,导入时建议勾选copy projects into workspace,将源码拷到你指定的工作空间。