2017-07-14 44 views
1

我试图连接到Sybase数据库Spring Boot应用程序。作为WAR文件运行时,Sybase JDBC连接登录失败;但在Eclipse中运行时登录成功

我使用JCONNECT jconn4 jdbc驱动

登录密码是在Sybase服务器上加密,所以我用BouncyCastle的加密API加密密码。

下面是块的代码

该代码使用纯JDBC测试连接,后来我打算修改该使用Spring的JdbcTemplate。

Connection con = null; 

    try { 
     Class.forName("com.sybase.jdbc4.jdbc.SybDriver"); 
     logger.info("Loaded Sybase driver successfully....."); 
    } catch (ClassNotFoundException cnfe) { 
     cnfe.printStackTrace(); 
    } 

String url = "jdbc:sybase:Tds:<url>:<port>/<databasename>"; 
    Properties props = new Properties(); 
    props.put("ENCRYPT_PASSWORD", "true"); 
    props.put("JCE_PROVIDER_CLASS", "org.bouncycastle.jce.provider.BouncyCastleProvider"); 
    props.put("user", "username"); 
    props.put("password", "pwd"); 

con = DriverManager.getConnection(url, props); 

当成功登录到Sybase服务器:

  1. 运行Eclipse IDE中的应用。

当登录失败到Sybase服务器:

  1. 运行中的Windows命令提示符下产生WAR文件。
  2. 内运行的Linux 壳牌开发/ QA服务器)所生成的WAR文件。

我试图alreday什么:

1.Compared jar文件的版本在运行应用程序使用了以下jars.Because有多个同罐子的版本文件存在于类路径(来自各种依赖关系)。

jconn4-7.07.jar(sybase jdbc driver)。 (bouncycastle crypto API)。

bcprov-jdk16-1.43.ja r(bouncycastle crypto API)。

我使用下面的代码块来找到应用程序在运行时使用的jar。

Class clazz = null; 
try { 
    clazz = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider"); 
    logger.info("BouncyCastleProvider is ... " + clazz.toString()); 

    if (clazz != null && clazz.getProtectionDomain() != null 
      && clazz.getProtectionDomain().getCodeSource() != null) { 
     URL codeLocation = clazz.getProtectionDomain().getCodeSource().getLocation(); 
     logger.info("BouncyCastleProvider jar is ... " + codeLocation.toString()); 
    } 

} catch (ClassNotFoundException e) { 
    logger.info(e.getMessage()); 
} 

2.Found 4版本的bcprov-jdk1x-x.xx.jar文件的通过pom.xml中的依赖层次窗口Eclipse和'排除' 在POM其中三个文件。这是为了避免版本冲突的jar文件。

但它不:-(工作。

为什么它能够内Eclispe的连接,而不是运行的WAR而?

任何帮助/方向会更有益。

回答

1

后一个大量的研究,花了差不多10小时的努力,我能够加入“CHARSET”到连接属性来解决这个问题。

props.put("CHARSET", "iso_1"); 

道德故事:问题可能会更大,但解决方案不是:-)。

相关问题