将spring framework源码导入Spring Tool Suite中

转自:http://wind-bell27.iteye.com/blog/1969930

先讲基本步骤,如下:

去GitHub中下载spring framework的源码,https://github.com/spring-projects/spring-framework/releases

下载3.2.X其中的一个版本;

安装Gradle软件,官网下载,解压即可,设置GRADLE_HOME,和PATH。

命令行中运行gradle -v,检查一下是否正确安装配置;

命令行中运行spring framework根目录下的import-into-eclipse.bat

连续两次回车,就可以开始自动构建;

中间出现停止不前的情况里,按ctrl+c终止,再运行就可以进行下去;

过程需要花些时间(几个小时都有可能),视下载各种依赖jar包和dom文件的速度而定;

在Eclipse菜单File->import选择General下面的Exsiting projects into workspace,这样就导入完成了。

如果你按上述步骤能一次成功的话,那不仅是你运气,而且RP极高。反正我没有,而且还折腾了好多次才成功能。

问题有以下几个:

问题一:spring-framework-4.0.0.M3要用jdk1.8

如果你习愦于什么都下最新版的,那么你肯定想都没想就下了spring-framework-4.0.0.M3,而且又那么不好采,正好没看README,那么问题马上就来了,直接报"-XX:MaxMetaspaceSize=1024m"及"could not create the java Virtual machine"的错误。

查看build.gradle和gradlew.bat中,可以找出原因:

build.gradle中:

Java代码

compileJava {

sourceCompatibility=1.6

targetCompatibility=1.6

}

compileTestJava {

sourceCompatibility=1.8

targetCompatibility=1.8

}

可以看出这个版本的test代码要求用1.8。

gradlew.bat中

Java代码

set GRADLE_OPTS=-XX:MaxMetaspaceSize=1024m -Xmx1024m -XX:MaxHeapSize=256m %GRADLE_OPTS%

其中-XX:MaxMetaspaceSize是1.8的写法。

所以如果下载的是4.0的版本,最好把jdk也升级到1.8,要不就下载一下3.2.x的版本就好了。

问题2:在build过程中,出现heap内存溢出情况

错误信息如下:

Java代码

FAILURE: Build failed with an exception.

* What went wrong:

Execution failedfortask':referencePdf'.

> GC overhead limit exceeded

* Try:

Run with --info or --debug option to get more log output.

* Exception is:

org.gradle.api.tasks.TaskExecutionException: Execution failedfortask ':referen

cePdf'.

at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex

ecuteActions(ExecuteActionsTaskExecuter.java:68)

at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex

ecute(ExecuteActionsTaskExecuter.java:46)

at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExec

uter.execute(PostExecutionAnalysisTaskExecuter.java:34)

at org.gradle.api.internal.changedetection.CacheLockHandlingTaskExecuter

$1.run(CacheLockHandlingTaskExecuter.java:34)

at org.gradle.internal.Factories$1.create(Factories.java:22)

at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(Def

aultCacheAccess.java:179)

at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(Def

aultCacheAccess.java:232)

at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunning

Operation(DefaultPersistentDirectoryStore.java:138)

at org.gradle.api.internal.changedetection.DefaultTaskArtifactStateCache

Access.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:83)

at org.gradle.api.internal.changedetection.CacheLockHandlingTaskExecuter

.execute(CacheLockHandlingTaskExecuter.java:32)

at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.exec

ute(SkipUpToDateTaskExecuter.java:55)

at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execut

e(ValidatingTaskExecuter.java:57)

at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecu

ter.execute(SkipEmptySourceFilesTaskExecuter.java:41)

at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter

.execute(SkipTaskWithNoActionsExecuter.java:51)

at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execut

e(SkipOnlyIfTaskExecuter.java:52)

at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter

.execute(ExecuteAtMostOnceTaskExecuter.java:42)

at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailur

e(AbstractTask.java:247)

at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.executeTask(De

faultTaskPlanExecutor.java:52)

at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.processTask(De

faultTaskPlanExecutor.java:38)

at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(Defaul

tTaskPlanExecutor.java:30)

at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(Defau

ltTaskGraphExecuter.java:83)

at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTask

ExecutionAction.java:29)

at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecute

r.java:61)

at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExec

uter.java:23)

at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecu

ter.java:67)

at org.gradle.api.internal.changedetection.TaskCacheLockHandlingBuildExe

cuter$1.run(TaskCacheLockHandlingBuildExecuter.java:31)

at org.gradle.internal.Factories$1.create(Factories.java:22)

at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAcc

ess.java:124)

at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAcc

ess.java:112)

at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(De

faultPersistentDirectoryStore.java:130)

at org.gradle.api.internal.changedetection.DefaultTaskArtifactStateCache

Access.useCache(DefaultTaskArtifactStateCacheAccess.java:79)

at org.gradle.api.internal.changedetection.TaskCacheLockHandlingBuildExe

cuter.execute(TaskCacheLockHandlingBuildExecuter.java:29)

at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecute

r.java:61)

at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExec

uter.java:23)

at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecu

ter.java:67)

at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildEx

ecutionAction.java:32)

at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecute

r.java:61)

at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecute

r.java:54)

at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(Default

GradleLauncher.java:158)

at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradle

Launcher.java:113)

at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLaun

cher.java:81)

at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.jav

a:38)

at org.gradle.launcher.exec.InProcessGradleLauncherActionExecuter.execut

e(InProcessGradleLauncherActionExecuter.java:39)

at org.gradle.launcher.exec.InProcessGradleLauncherActionExecuter.execut

e(InProcessGradleLauncherActionExecuter.java:25)

at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:50)

at org.gradle.api.internal.Actions$RunnableActionAdapter.execute(Actions

.java:137)

at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.

execute(CommandLineActionFactory.java:201)

at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.

execute(CommandLineActionFactory.java:174)

at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(

CommandLineActionFactory.java:170)

at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(

CommandLineActionFactory.java:139)

at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionRep

ortingAction.java:33)

at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionRep

ortingAction.java:22)

at org.gradle.launcher.Main.doAction(Main.java:48)

at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)

at org.gradle.launcher.Main.main(Main.java:39)

at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBoots

trap.java:50)

at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.j

ava:32)

at org.gradle.launcher.GradleMain.main(GradleMain.java:26)

at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.ja

va:33)

at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130)

at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)

Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

at org.apache.fop.area.inline.TextArea.addWord(TextArea.java:68)

at org.apache.fop.layoutmgr.inline.TextLayoutManager.createTextArea(Text

LayoutManager.java:483)

at org.apache.fop.layoutmgr.inline.TextLayoutManager.addAreas(TextLayout

Manager.java:361)

at org.apache.fop.layoutmgr.inline.LineLayoutManager.addInlineArea(LineL

ayoutManager.java:1716)

at org.apache.fop.layoutmgr.inline.LineLayoutManager.addAreas(LineLayout

Manager.java:1568)

at org.apache.fop.layoutmgr.BlockLayoutManager.addAreas(BlockLayoutManag

er.java:395)

at org.apache.fop.layoutmgr.BlockLayoutManager.addAreas(BlockLayoutManag

er.java:395)

at org.apache.fop.layoutmgr.BlockLayoutManager.addAreas(BlockLayoutManag

er.java:395)

at org.apache.fop.layoutmgr.BlockLayoutManager.addAreas(BlockLayoutManag

er.java:395)

at org.apache.fop.layoutmgr.AreaAdditionUtil.addAreas(AreaAdditionUtil.j

ava:121)

at org.apache.fop.layoutmgr.FlowLayoutManager.addAreas(FlowLayoutManager

.java:305)

at org.apache.fop.layoutmgr.PageBreaker.addAreas(PageBreaker.java:241)

at org.apache.fop.layoutmgr.AbstractBreaker.addAreas(AbstractBreaker.jav

a:508)

at org.apache.fop.layoutmgr.AbstractBreaker.addAreas(AbstractBreaker.jav

a:371)

at org.apache.fop.layoutmgr.PageBreaker.doPhase3(PageBreaker.java:262)

at org.apache.fop.layoutmgr.AbstractBreaker.doLayout(AbstractBreaker.jav

a:346)

at org.apache.fop.layoutmgr.AbstractBreaker.doLayout(AbstractBreaker.jav

a:264)

at org.apache.fop.layoutmgr.PageSequenceLayoutManager.activateLayout(Pag

eSequenceLayoutManager.java:106)

at org.apache.fop.area.AreaTreeHandler.endPageSequence(AreaTreeHandler.j

ava:234)

at org.apache.fop.fo.pagination.PageSequence.endOfNode(PageSequence.java

:123)

at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilde

r.java:340)

at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:169)

at org.apache.xalan.transformer.TransformerIdentityImpl.endElement(Trans

formerIdentityImpl.java:1050)

at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source

)

at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknow

n Source)

at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContent

Dispatcher.dispatch(Unknown Source)

at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Un

known Source)

at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)

at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)

at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)

at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)

at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Transf

ormerIdentityImpl.java:432)

BUILD FAILED

那就把gradlew.bat的内存设置调大一点,我做实验时,机器的内存是8G、64位系统,直接使用

set GRADLE_OPTS=-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=1024m %GRADLE_OPTS%

(我下载的是spring-framework-3.2.1.RELEASE版本,jdk1.7)

问题3:gradle命令的使用

在spring源码的根目录下,提供gradlew.bat和

import-into-eclipse.bat这两个命令,都可以build源码,但如果使用前者就不会生成eclipse的环境需要的一些文件,如下图所示:

另外,在使用import-into-eclipse.bat这个命令build时,可能会遇到一个问题,错误日志如下:

Java代码

FAILURE: Build failed with an exception.

* What went wrong:

Execution failedfortask':spring-webmvc-tiles3:eclipseClasspath'.

> Could not resolve all dependenciesforconfiguration'detachedConfiguration2'.

> Module version group:org.springframework, module:spring-webmvc-tiles3, vers

ion:3.2.1.RELEASE, configuration:detachedConfiguration2 declares a dependency on

configuration'runtimeMerge'which is not declared in the module descriptorfor

group:org.springframework, module:spring-web, version:3.2.1.RELEASE

* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug

option to get more log output.

从日志中可以看出是在build spring-webmvc-tiles3项目时,生成eclipse的.classpath文件时出错,打开其它正常导入的项目的.classpath看下这个文件包含了哪些信息,如打开spring-aop项目的:

Java代码


而spring-webmvc-tiles3下根本就没有.classpath的影子,没得比较,虽然上面的错误日志的E文都认识,但还是看不出它在讲什么,不过大体能看得出是依赖出了问题,那只能是想办法顺藤摸瓜了。重新打开build.gradle,找到有关spring-webmvc-tiles3项目的描述,如下:

Java代码

project("spring-webmvc-tiles3") {

description ="Spring Framework Tiles3 Integration"

merge.into = project(":spring-webmvc")

dependencies {

provided(project(":spring-context"))

provided(project(":spring-web"))

provided("javax.el:el-api:1.0")

provided("javax.servlet:jstl:1.2")

provided("javax.servlet.jsp:jsp-api:2.1")

optional("org.apache.tiles:tiles-request-api:1.0.1")

optional("org.apache.tiles:tiles-api:3.0.1")

optional("org.apache.tiles:tiles-core:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-servlet:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-jsp:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-extras:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-el:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

provided("javax.servlet:javax.servlet-api:3.0.1")

testCompile("org.slf4j:slf4j-jcl:${slf4jVersion}")

}

}

打开C:/Users/so/.gradle/caches/artifacts-15/filestore,挨个依赖进行检查,jar包倒是最下载下来了,但是"org.apache.tiles:tiles-jsp:3.0.1"、"org.apache.tiles:tiles-extras:3.0.1"、"org.apache.tiles:tiles-el:3.0.1"三个却没有下载到source,其它包都有jar、pom、source三个目录,这三个没有source目录,只有jar、pom目录,问题应该是出现在这里。

后来终于让我找到了这么一个东西:http://issues.gradle.org/browse/GRADLE-1157,正好证实我前面的猜想,所以按照issue中的解决办法,在build.gradle中加上如下部分:

Java代码

eclipseClasspath {

downloadSources =false;// required for eclipseClasspath to work

}

关于spring-webmvc-tiles3项目的脚本、就变成这样了:

Java代码

project("spring-webmvc-tiles3") {

description ="Spring Framework Tiles3 Integration"

merge.into = project(":spring-webmvc")

dependencies {

provided(project(":spring-context"))

provided(project(":spring-web"))

provided("javax.el:el-api:1.0")

provided("javax.servlet:jstl:1.2")

provided("javax.servlet.jsp:jsp-api:2.1")

optional("org.apache.tiles:tiles-request-api:1.0.1")

optional("org.apache.tiles:tiles-api:3.0.1")

optional("org.apache.tiles:tiles-core:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-servlet:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-jsp:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-extras:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

optional("org.apache.tiles:tiles-el:3.0.1") {

exclude group:"org.slf4j", module:"jcl-over-slf4j"

}

provided("javax.servlet:javax.servlet-api:3.0.1")

testCompile("org.slf4j:slf4j-jcl:${slf4jVersion}")

}

eclipseClasspath {

downloadSources =false;// required for eclipseClasspath to work

}

}

重新运行命令,这一次终于让我看到了BUILD SUCCESSFUL的字样了……

成功build完成后,可以看到spring目录下的spring-webmvc-tiles3项目也正常生成了导入eclipse需要的文件。打开.classpath查看一下:

Java代码


果然没有sourcepath的信息。

折腾了那么久,终于到了可以看一下成果的时候了。

Spring Tool Suite说简单一点就是Spring家的eclipse,去官网下一个最新版,安装上。

打开STS,菜单File->import选择General下面的Exsiting projects into workspace,勾选要导入的子项目,确定即可。

成果如上,齐齐整整,没有错误,挺好!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容