最近工作需要修改spring-core源码,在编译过程遇到点问题记录如下:
地址:http://grepcode.com/snapshot/repo1.maven.org/maven2/org.springframework/spring-core/4.0.4.RELEASE
Spring Core
Project metadata download:
spring-core-4.0.4.RELEASE.pom
Binary download:
spring-core-4.0.4.RELEASE.jar
Source download:
spring-core-4.0.4.RELEASE-sources.jar
将
Source下载解压,导入IDEA中,贴上pom文件,编译,发现报错如下:
spring-core\src\main\java\org\springframework\cglib\core\SpringNamingPolicy.java:[30,40] 错误: 找不到符号
spring-core\src\main\java\org\springframework\cglib\core\SpringNamingPolicy.java:[34,1] 错误: 方法不会覆盖或实现超类型的方法
网上查询,发现是缺少了spring-cglib-repack.jar和spring-objenesis-repack.jar两个包,具体版本要根据你编译的spring-core的版本来定
如何获取正确的2个jar包呢,办法如下:
1.在maven仓库中下载对应版本的jar包 我这里下载 Spring Core » 4.0.4.RELEASE
2.解压开
3.建立 pac_ajr_cglib 和 pac_jar_objenesis 目录,然后按照如下结构建立目录,并将第2步解压的 cglib 和 objenesis 拷贝到 如下目录中
├─pac_jar_cglib
│ └─org
│ └─springframework
│ └─cglib
│
└─pac_jar_objenesis
└─org
└─springframework
└─objenesis
│ └─org
│ └─springframework
│ └─cglib
│
└─pac_jar_objenesis
└─org
└─springframework
└─objenesis
4.选中绿色背景的文件夹,按住shift键,鼠标右键—>在此处打开CMD。在命令行窗口 输入 jar cvf xxxxxx.jar *
如 从“pac_jar_objenesis”文件夹进入命令行CMD,执行下面的命令
jar cvf spring-objenesis-repack-2.4.jar * ps:其中 * 代表目录下所有文件被打包进jar文件
就会生成 spring-objenesis-repack-2.4.jar
5.然后在传到本地仓库,在pom文件里面添加引用
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-objenesis-repack</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-cglib-repack</artifactId>
<version>3.2.4</version>
</dependency>
6.打jar包并包含依赖jar文件(解压依赖jar并打包)pom文件设置
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass></mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
7.依赖jar,打包说明,由于打包只需要包含spring-cglib-repack.jar和spring-objenesis-repack.jar两个包的类,所以在package的时候需要将前4个依赖jar包的scope属性由 compile 改成 test ,这样打出来的包就不包含它们了。
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>net.sf.jopt-simple</groupId>
<artifactId>jopt-simple</artifactId>
<version>4.6</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-objenesis-repack</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-cglib-repack</artifactId>
<version>3.2.4</version>
</dependency>
</dependencies>
8.最终target目录下面会生成一个spring-core-4.0.4.RELEASE-jar-with-dependencies.jar 发现它和maven下载的 jar包大小已经相差不大了 ,完毕!