java项目,在eclipse运行正常,但是导出jar包,单独运行时,gp数据库连接失败,报错是字符串下标越界
开始以为哪里写的有问题,重新创建了一个测试工程,还是报错
```java
//如下是连接GP的类和方法
public class GPCON {
public static String connectionString = "jdbc:pivotal:greenplum://172.26.32.25:5432;DatabaseName=mtp";
public static String user = "admin";
public static String password = "admin*";
Connection connection = null;
/**连接数据库*/
public void con(){
try {
Class.forName("com.pivotal.jdbc.GreenplumDriver");
connection = DriverManager.getConnection(connectionString,user,password);
System.out.println("GP数据库连接成功!!!");
} catch (Exception e) {
System.err.println("数据库连接出现异常 " + e.getMessage());
e.printStackTrace();
return;
}
}
}
//如下是调用的类和方法
public class T {
public static void main(String[] args) {
GPCON gpcon =new GPCON();
gpcon.con();
}
}
打包jar运行报错如下
数据库连接出现异常 String index out of range: -6
java.lang.StringIndexOutOfBoundsException: String index out of range: -6
at java.lang.String.substring(Unknown Source)
at com.pivotal.jdbc.greenplumbase.ddda.<init>(Unknown Source)
at com.pivotal.jdbc.greenplumbase.BaseConnection.a(Unknown Source)
at com.pivotal.jdbc.greenplumbase.BaseDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at GPCON.con(GPCON.java:18)
at T.main(T.java:5)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
```
下标越界与在 eclipse 中运行还是打包成 jar 包运行无关,而是访问了超出字符串最大下标的字符,建议在程序中加一个判断,如果下标位置超过字符串的最大下标位置,就不要取字符串中的字符了。
终于找到问题了,不是驱动的问题,报错不符,实际报错应该是找不到驱动类,之所以报错下标越界,应该是eclipse工具的问题,生成jar包的配置文件,类路径下多了一行,就是这一行导致的报错,删除后就会有真正的报错。解压驱动包把com文件夹复制到根目录下解决