目录
4.2.4. 找不到org.springframework.aop.target
1. 搭建gradle环境和下载源码
1.1. 下载源码
上github搜 spring-framework,找到star数最多的,用git clone或者下载.zip文件的形式都可以,把源码下载下来。
打开源码文件夹,在 gradle -> wrapper -> gradle-wrapper.properties 文件中,找到如下属性配置:
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
根据上面的gradle版本号,去 https://services.gradle.org/distributions/ 下载对应版本的gradle文件。
bin结尾的是gradle执行环境,src结尾的是源码文件,all结尾的包括bin和src。
下载gradle文件后,一份用于搭建gradle环境,另一份拷到源码文件夹的gradle -> wrapper 目录下,
然后将上述属性配置改为:
distributionUrl=gradle-5.6.4-bin.zip
这样在使用gradlew进行预编译时,就不用再去下载执行文件了。
1.2. 搭建gradle环境
解压你的gradle文件到自定义的安装目录下,然后用如下命令创建一个本地仓库:
mkdir .gradle
本地仓库的位置自己定。
然后配置环境变量:
>1 新建变量:GRADLE_HOME,就是你的gradle的安装目录,比如:D:\DevTools\gradle\gradle-5.6
>2 新建变量:GRADLE_USER_HOME,这个是你的gradle的本地仓库目录,比如:D:\DevTools\gradle\.gradle
>3 在Path中,添加:%GRADLE_HOME%\bin
>4 如果有maven仓库,并且想在构建项目时使用maven仓库,配置的maven地址必须是M2_HOME(不能是 MAVEN_HOME),否则gradle找不到你的maven配置。
打开命令行,输入gradle -v,如果弹出提示,则配置成功。
1.3. 配置gradle的默认镜像
在你的gradle仓库中(.gradle目录下),新建一个init.gradle文件,其中写入:
allprojects{
repositories {
mavenLocal()
maven { url "https://maven.aliyun.com/nexus/content/groups/public/"}
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
remove repo
}
if (url.startsWith('https://plugins.gradle.org/m2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
remove repo
}
}
}
maven { url ALIYUN_REPOSITORY_URL }
maven { url ALIYUN_JCENTER_URL }
maven { url ALIYUN_GOOGLE_URL }
maven { url ALIYUN_GRADLE_PLUGIN_URL }
}
}
2. 预编译spring-oxm
2.1. 配置build.gradle
我下载的源码目录为:spring-framework-study,那么进入该目录你可以看到一个import-into-idea.md,
打开它可以看到引入idea前需要做的工作:
1. Precompile `spring-oxm` with `./gradlew :spring-oxm:compileTestJava`
2. Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
3. When prompted exclude the `spring-aspects` module (or after the import via File-> Project Structure -> Modules)
4. Code away
解释一下:
1 你需要预编译spring-oxm;2 选择build.gradle导入idea;3 将spring-aspects从项目结构中排除
打开源码主目录下的build.gradle,先配置镜像:
buildscript {
repositories {
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
google()
jcenter()
}
}
plugins {
...
}
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
google()
jcenter()
}
}
注意:gradle配置时,buildscript和plugins必须在第一行配置。如果有buildscrpit,那么它必须在第一行。
(plugins中的插件后面可能带有 apply false,将 apply false 全部删除,即应用所有插件)
找到 build.gradle中的 configure(allprojects) 中的 repositories,配置如下:
repositories {
mavenLocal()
//mavenCentral()
maven { url "https://repo.springsource.org/plugins-release" }
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
注意:所有的仓库配置url前的http都要加上s:"https://xxx",要不然 > Task :checkstyleNohttp 任务会报错。
2.2. 配置settings.gradle
将 include "spring-aspects" 注释掉:
//include "spring-aspects"
2.3. 预编译
在项目目录下,运行命令行命令(windows下):
gradlew.bat :spring-oxm:compileTestJava
注意:网上说的中间加 cleanIdea,此时(第一次编译)并不管用,会报错。
2.4. 结果
如果结果中有 BUILD SUCCESSFUL 字样就明预编译成功,
可能出现的错误:
Build scan background action failed.
org.gradle.process.internal.ExecException: Process 'command 'git'' finished with non-zero exit value 128
git的问题,暂时还不知道如何解决,不影响构建。
3. 构建源码
3.1. 导入Idea
Idea中,import project ,然后选择源码主目录下的build.gradle,然后导入。
配置本地的gradle:
导入后,会进行configure build,过程很漫长。
还是找BUILD SUCCESSFUL字样。
3.2. 开始构建
在gradle选项卡中,找到build命令,双击开始构建
又是一个漫长的过程。
构建完毕后,找BUILD SUCCESSFUL字样。
3.3. 错误
1. 如果构建过程中报错,采用如下办法:
一开始尝试直接构建Spring源码,在构建的过程中会报错,通过修改docs.gradle 脚本,注释 dokka 和 asciidoctor
docs.gradle文件在gradle目录下。
2. 报错:validUsage()
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
注释:spring-test.gradle中这行代码
// useJUnitPlatform {
// includeEngines 'junit-jupiter'
// excludeTags 'failing-test-case'
// }
4. 测试
4.1. 搭建测试Module
在主目录下新建Module,然后选择gradle -> jar,ArtifactId和groupId自己填。
项目结构如下:
在新建的Module中的build.gradle,添加如下依赖:
dependencies {
compile(project(":spring-context"))
compile(project(":spring-instrument"))
compile 'junit:junit:4.12'
compile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
}
我的TestApp是我的主程序入口,在其中用到了junit,所以需要在添加依赖时,使用compile,而不是testCompile.
junit依赖hamcrest-core,所以也要引入后者。
public class TestApp {
@Test
public void MyTest() {
ClassPathResource res = new ClassPathResource("spring-config.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
System.out.println(factory.getBean(TestBean.class).getName());
}
}
TestBean.java:
public class TestBean {
private String name = "hehe";
public TestBean(String name) {
this.name = name;
}
public TestBean() {
}
@Override
public String toString() {
return "TestBean{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
spring-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="testBean" class="com.gaojx.spring.hello.TestBean"/>
</beans>
4.2 踩的坑
4.2.1. 找不到符号 coroutinesutils
build时,提示找不到CoroutinesUtils,解决方法:
在spring-core -> kotlin-coroutines -> src -> main -> kotlin -> org.framework.core -> CoroutinesUtils.kt 上,
右键,Build Module 'spring-kotlin-coroutines.main':
4.2.2 No tasks available
运行Run @Test时,提示 No tasks available,
在 File -> settings -> gradle,将下列选项替换成 IntelliJ IDEA:
4.2.3. 引入cglib时缺失jar包
构建时,缺失spring-cglib-repack和spring-objenesis-repack,(在spring-core模块下,提示上述两个jar包缺失)。
在gradle选项卡中,spring主项目下,Tasks -> other,双击 cglibRepackJar 和 objenesisRepackJar:
此时在项目的settings.gradle中,就可以打开 include "spring-aspects" 了。
4.2.4. 找不到org.springframework.aop.target
build时提示:程序包org.springframework.aop.target 不存在。
这个是最最最最最最弱智的失误了!!!!
因为我在Idea的设置中,将名称为target的目录给隐藏了:
所以程序一直提示找不到aop下面的target包。
最终测试成功:
参考
https://www.cnblogs.com/yjteilz/p/6228833.html
https://blog.youkuaiyun.com/Pphu_1220/article/details/104528492
https://www.cnblogs.com/coderxiaohei/p/11628378.html
https://www.cnblogs.com/java-chen-hao/p/11046190.html
https://www.cnblogs.com/coderdxj/p/11437873.html
https://blog.youkuaiyun.com/baomw/article/details/83956300
https://blog.youkuaiyun.com/yzpbright/article/details/53492458