这篇纯当是做个踩坑记录,对于需要自行编译 mysql-connector-java 的同学可能会有些帮助。
好了,废话不多说,首先吐槽官方文档(点击进入),如果你严格按官方文档来进行,那必然是编译不过的,理由你很快就会知道了。
那就先让我们按着官方的文档来吧,先 clone 下来代码:
$ git clone --branch release/8.0 https://github.com/mysql/mysql-connector-j.git
然后下载好应有的文件并且放在一个目录下,这里我放在了 mysql-connector-j/libs
下面,目录结构如下:
$ cd mysql-connector-j/libs
$ ls
c3p0-0.9.1.2.jar
c3p0-0.9.1.2.src.zip
javassist.jar
jboss-common-jdbc-wrapper-3.2.3.jar
junit-4.12.jar
protobuf-java-3.6.1.jar
slf4j-api-1.6.1.jar
然后编写一个 build.properties
,写入以下内容:
com.mysql.cj.build.jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/
com.mysql.cj.extra.libs=./libs
然后按官方的说法,直接编译就可以了:
$ ant dist
好的,这一步你就会知道官方有多坑了,因为 jboss-common-jdbc-wrapper
里面并没有 MySQLExceptionSorter
这个类,而 c3p0
内也没有 QueryConnectionTester
,所以这两块必定是编不过去的。
所以这个时候就只能修改编译脚本了,这似乎是上个时代的产物,还在用 ant
编译,但是没有办法,也只能硬啃了,好在我对 ant
并非完全不懂。
接下来找到编译部分的代码并注释掉就可以了:
<target name="-compile-integration-c3p0" depends="compile-driver" if="${com.mysql.cj.c3p0Present}">
... ...
</target>
<target name="-compile-integration-jboss" depends="compile-driver" if="${com.mysql.cj.jbossPresent}">
... ...
</target>
同时,还需要找到使用了这两个 target 的地方,即 compile-integration
,把其中的 depends
予以改动:
原始:
depends="compile-driver, -compile-integration-c3p0, -compile-integration-jboss"
改为:
depends="compile-driver"
这个时候就可以顺利的使用 ant dist
来进行编译了。当然我们还可以新建一个项目来验证驱动是否正常工作,在此不述。
此处有一个坑,当你使用最新的代码编译时,在使用该驱动时,会发生一个很坑的问题:
fun main(args: Array<String>) {
Class.forName("com.mysql.cj.jdbc.Driver")
DriverManager.getConnection("jdbc:mysql://localhost:3306/YGOData","root","root").use { conn ->
conn.prepareStatement("select * from Collect").use { stmt ->
stmt.executeQuery().use { result ->
result.forEach { item ->
println(item.string("name"))
}
}
}
}
}
粗看代码是不是完好?看不出问题吧,然而问题发生在 result.forEach
句,它指出了 ResultSet
是 TYPE_FORWARD_ONLY
的,因此只能向前遍历。
所以我们要从驱动本身来修一下这个问题,找到 ConnectionImpl.java
,修改其 DEFAULT_RESULT_SET_TYPE
的值为 ResultSet.TYPE_SCROLL_INSENSITIVE
。再找到 StatementWrapper.java
,将其中 getResultSetType
函数的最后一行改为 return ResultSet.TYPE_SCROLL_INSENSITIVE;
,然后再次编译驱动即可。
你以为这就结束了?刚才我也说了这玩艺是上古时代的产物了吧,更现代的管理方式就需要用到 maven 和 gradle 了,这里我给出一个 maven 的配置,gradle 的话大家自己看着写就可以了。作为一个喜欢夹带私货的人,我同时配了 kotlin 的支持,以后写起代码就更方便了吧。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<properties>
<kotlin.version>1.3.61</kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk7</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<jvmTarget>1.8</jvmTarget>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}/jar</directory>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>