问题.spring源码转换为eclipse遇到的问题
1.下载spring源码
2.下载安装gradle,配置环境变量
3.在spring子项目下执行命令:gradle cleanidea eclipse,会生成对应的.project及.classpath文件
4.eclipse导入project
第一步和第二步就没必要说了,在执行第三步的遇到一个如下问题:

错误报告意思应该是:调用ProjectDependency的构造函数时传的参数与定义的不匹配。好在报告上说出了在哪里调用的:ide.gradle
import org.gradle.plugins.ide.eclipse.model.ProjectDependency
import org.gradle.plugins.ide.eclipse.model.SourceFolder apply plugin: "propdeps-eclipse"
apply plugin: "propdeps-idea" eclipse.jdt {
sourceCompatibility = 1.8
targetCompatibility = 1.8
} // Replace classpath entries with project dependencies (GRADLE-1116)
// http://issues.gradle.org/browse/GRADLE-1116
eclipse.classpath.file.whenMerged { classpath ->
def regexp = /.*?\/([^\/]+)\/build\/[^\/]+\/(?:main|test)/ // only match those that end in main or test (avoids removing necessary entries like build/classes/jaxb)
def projectOutputDependencies = classpath.entries.findAll { entry -> entry.path =~ regexp }
projectOutputDependencies.each { entry ->
def matcher = (entry.path =~ regexp)
if (matcher) {
def projectName = matcher[0][1]
def path = "/${projectName}"
if(!classpath.entries.find { e -> e instanceof ProjectDependency && e.path == path }) {
def dependency = new ProjectDependency(path, project(":${projectName}").path)
dependency.exported = true
classpath.entries.add(dependency)
}
classpath.entries.remove(entry)
}
}
classpath.entries.removeAll { entry -> (entry.path =~ /(?!.*?repack.*\.jar).*?\/([^\/]+)\/build\/libs\/[^\/]+\.jar/) }
}
在line:24看到 def dependency = new ProjectDependency(path, project(":${projectName}").path),这显然在创建对象时传入的参数与构造函数的定义不匹配,看上面import知道这个类是由gradle来定义的,所以再去确认下gradle中这个类的定义。
需要下载gradle全量包,在src目录下可以找到对应的类源码:
package org.gradle.plugins.ide.eclipse.model; import com.google.common.base.Preconditions;
import groovy.util.Node; /**
* A classpath entry representing a project dependency.
*/
public class ProjectDependency extends AbstractClasspathEntry { public ProjectDependency(Node node) {
super(node);
assertPathIsValid();
} /**
* Create a dependency on another Eclipse project.
* @param path The path to the Eclipse project, which is the name of the eclipse project preceded by "/".
*/
public ProjectDependency(String path) {
super(path);
assertPathIsValid();
} private void assertPathIsValid() {
Preconditions.checkArgument(path.startsWith("/"));
} @Override
public String getKind() {
return "src";
} @Override
public String toString() {
return "ProjectDependency" + super.toString();
}
}
可以看到,构造函数中只要传个path就可以了,看这个注释的意思应该就是传参时的那个path。
这个时候抱着试一试的心态将脚本传的参数project(":${projectName}").path去除后,重新执行命令,然后。。。build successful。
回顾这个问题,其实就是脚本传参不对,根据提示找到对应类的定义知道应该传什么参数。
这地方怀疑可能是gradle更新了这个函数定义,但spring没有去更新这个脚本。或者它们用的gradle的版本与我的不一样。我本地下的是gradle-4.0

后来发现这个坑真的是我自己挖的,在spring源码路径下有gradle脚本,打开会看到它去尝试下载gradle-3.5,然后我又下了3.5,果然........
package org.gradle.plugins.ide.eclipse.model; import com.google.common.base.Preconditions;
import groovy.util.Node;
import org.gradle.util.DeprecationLogger; /**
* A classpath entry representing a project dependency.
*/
public class ProjectDependency extends AbstractClasspathEntry { private String gradlePath; public ProjectDependency(Node node) {
super(node);
assertPathIsValid();
} /**
* Create a dependency on another Eclipse project.
* @param path The path to the Eclipse project, which is the name of the eclipse project preceded by "/".
*/
public ProjectDependency(String path) {
super(path);
assertPathIsValid();
} /**
* Create a dependency on another Eclipse project.
* @deprecated Use {@link #ProjectDependency(String)} instead
*/
@Deprecated
public ProjectDependency(String path, String gradlePath) {
this(path);
DeprecationLogger.nagUserOfDiscontinuedMethod("ProjectDependency(String path, String gradlePath)", "Please use ProjectDependency(String path) instead.");
this.gradlePath = gradlePath;
} ...
}
这里可以看到一个构造函数的定义,line:33,改好本地gradle后,直接在spring目录下执行gradle cleanidea eclipse试试,应该是success的
但是导入之后并没有结束,会看到依然有红叉、感叹号等错误。需要编译的编译生成class文件,项目中有依赖、
然后在编译时又遇如下一坑

找到出错方法的定义:
public class PropertyComparator<T> implements Comparator<T> {
...
public static void sort(List<?> source, SortDefinition sortDefinition) throws BeansException {
if (StringUtils.hasText(sortDefinition.getProperty())) {
Collections.sort(source, new PropertyComparator<>(sortDefinition));
}
}
...
}
根据报错信息,这地方编译器期望的应该是sort(List<T> source, SortDefinition sortDefinition),而这个方法是static,非static的T用不进来,
所以这地方,我直接改成了sort(List source, SortDefinition sortDefinition),将泛型去掉了,这样的话应该编译器会报一个warning,但总归能继续编译下去了。。。
编译的话可以直接用源码路径下的批处理命令:gradlew.bat(预编译)和import-into-eclipse.bat,最后:

过程中还会遇到各种其他坑,上面的两个坑只是作为补充
问题.spring源码转换为eclipse遇到的问题的更多相关文章
- spring源码解析——spring源码导入eclipse
一.前言 众所周知,spring的强大之处.几乎所有的企业级开发中,都使用了spring了.在日常的开发中,我们是否只知道spring的配置,以及简单的使用场景.对其实现的代码没有进行深入的了 ...
- 将Spring源码转换为工程 + 导入Eclipse时缺失jar包
将源码转换为工程: 比如查看Spring事务部分的源码. 打开cmd窗口,切换到Spring-tx文件夹下,执行命令 “gradle cleanidea eclipse” . 缺失jar包: 第一步: ...
- 导入spring源码到eclipse
1.1安装Gradle 可以从http://www.gradle.org/downloads页面下载Gradle.下载后将文件解压到指定目录,我放在D:\软件\gradle-3.3,然后设置环境变量. ...
- spring 源码导入eclipse(sts)
一. 准备工作 1.下载安装sts(springsource推荐使用) 下载地址: http://www.springsource.org/downloads/sts-ggts 2.下载安装gradl ...
- spring 源码导入eclipse
使用 gradle: ..opensource\v3.: 错误: 程序包org.apache.commons.pool.impl不存在 最后发现是依赖的包commons-pool没有配置.关键是刚用 ...
- spring源码_下载以及转入eclipse (2016-11-08)
本例spring源码版本是4.3.0的, 所以jdk需要准备1.8的(不同版本源码要求的jdk不一样) 1.8版本myeclipse10无编译环境,只有运行环境,出现点问题,下载最新版本的Eclips ...
- spring源码下载及转入ECLIPSE
转自:https://www.cnblogs.com/scevecn/p/6043284.html 本例spring源码版本是4.3.0的, 所以jdk需要准备1.8的(不同版本源码要求的jdk不一样 ...
- 在Eclipse上通过插件获取github上的spring源码
spring源码开始的时候是通过SVN来管理代码的,后来是转移到github上管理源码的,可以通过在github上直接下载spring的源码. 下面讲解如何通过在eclipse上的插件git来获取sp ...
- spring 源码如何导入到eclipse
spring 源码如何导入到eclipse spring源码解析——spring源码导入eclipse spring framework源码下载并导入eclipse
随机推荐
- 整理用Java实现数字转化成字符串左边自动补零方法
Java 中给数字左边补0 (1)方法一 import java.text.NumberFormat; public class NumberFormatTest { public static vo ...
- Kubernetes容器集群管理环境 - 完整部署(上篇)
Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...
- 的Blog
作者:Ovear链接:https://www.zhihu.com/question/20215561/answer/40316953来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- hadoop大数据平台安全基础知识入门
概述 以 Hortonworks Data Platform (HDP) 平台为例 ,hadoop大数据平台的安全机制包括以下两个方面: 身份认证 即核实一个使用者的真实身份,一个使用者来使用大数据引 ...
- vue中使用vue-amap(高德地图)
因为项目要求调用高德地图,就按照官方文档按部就班的捣鼓,这一路上出了不少问题. 前言: vue-cli,node环境什么的自己安装设置推荐一个博客:https://blog.csdn.net/wula ...
- 关于http 500错误的小结分享
一般情况下,http 500内部服务器(HTTP-Internal Server Error)错误说明IIS服务器无法解析ASP代码,访问一个静态页面试试是否也出现这个问题. 如果访问静态页面没问题, ...
- 如何创建Github创库
重点:利用Markdown语言写简单的日常使用的文本 基础写作和语法格式 本篇文章的内容来源于Github的基础写作帮助.如果在观看时有什么问题,可以直接查阅源文件.另外需要说明的是Git对Markd ...
- 直击--vue项目微信小程序页面跳转web-view不刷新-根源
背景 最近项目需要适配小程序,项目是使用了vue开发的网站,其中改造方式是,每个页面都使用小程序创建一个页面通过web-view来显示指定页面的. 在没有使用小程序时,路由跳转时,刷新页面等等,这个是 ...
- 编程杂谈——Platform target x64
在Visual Studio中选择.NET Framework框架并选用任意模板创建一个普通的Web应用工程,毫无疑问,此时应该是能够正常运行此工程的. 但是将工程属性->编译->Plat ...
- 深圳市宁远电子大骆驼DLT3288C-韦根输入接口说明
DLT3288C 板卡上有一组韦根接口,位置如下图所示: 注意:韦根与 RS485 是同时使用一组 Pin 脚,功能二选一.板子默认是 RS485,需要韦 根功能的,需跳电阻. 1.设备控制节点 ...