Tomcat

时间:2016-03-07 07:22:01

标签: java tomcat tomcat7 classloader spring-jdbc

我在 hive-jdbc-0.13.1-cdh5.3.3.jar 中修改了几个类(如HiveConnection.class,HiveDatabaseMetaData.class,HiveResultSetMetaData.class,HiveStatement.class),并创建了一个新的jar,它只包含修改过的类,并将其命名为 0_modified_hive_jdbc.jar

这些类有一些覆盖方法,它们抛出方法不支持异常。相反,我们使用相同的名称创建了类,我们记录了消息,而没有抛出异常。

在tomcat / lib中放置 hive-jdbc-0.13.1-cdh5.3.3.jar (因为org.apache.hive.jdbc.HiveDriver在服务器中被称为JNDI的驱动程序名称.XML)

我已经放置了所有这样的外部罐子,

/home/nages/external_jar/0_override/0_modified_hive_jdbc.jar
/home/nages/external_jar/hive/hive-jdbc-0.13.1-cdh5.3.3.jar
/home/nages/external_jar/others/commons-lang-2.5.jar
/home/nages/external_jar/others/spring-beans-2.5.3.jar
/home/nages/external_jar/others/spring-context-2.5.3.jar
/home/nages/external_jar/others/spring-core-2.5.3.jar
/home/nages/external_jar/others/spring-jdbc-2.5.3.jar
/home/nages/external_jar/others/spring-tx-2.5.3.jar
etc..

像这样提到这些罐子

文件 /home/nages/tomcat/conf/Catalina/localhost/myapp.xml

<Context reloadable="true" path="/myapp">
<Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="/home/nages/external_jar/0_overrider/*.jar;/home/nages/external_jar/hive/*.jar;/home/nages/external_jar/others/*.jar;/etc/hadoop/conf/;"/>
</Context>

在tomcat中部署我的应用程序(myapp.war)。

在myapp.war中提供的find.jsp。

/home/nages/tomcat/webapps/myapp/find.jsp

以下是find.jsp

中提供的一段代码
ClassLoader loader = clazz.getClassLoader();

if (loader == null){
        throw new Exception("Class Loader is null.");
}
String fileName = className.replace('.','/')+".class";
URL fileUrl = loader.getResource(fileName);
out.println("<b>Location : </b>" + fileUrl);

当我在find.jsp中请求org.apache.hive.jdbc.HiveConnection时,它会返回,

位置:jar:file:/home/nages/external_jar/0_override/0_modified_hive_jdbc.jar!/org/apache/hive/jdbc/HiveConnection.class。

在战争中有一个java类,它有以下代码

import     org.springframework.jdbc.core.JdbcTemplate;
import     org.springframework.jdbc.support.rowset.SqlRowSet;

JdbcTemplate template = new JdbcTemplate(getDataSource("Hive"));        
SqlRowSet sqs = template.queryForRowSet(sqlQuery);

我遇到了异常

Caused by: java.sql.SQLException: Method not supported
        at org.apache.hive.jdbc.HiveResultSetMetaData.isSigned(HiveResultSetMetaData.java:141)
        at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:726)
        at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:640)
        at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.createSqlRowSet(SqlRowSetResultSetExtractor.java:66)
        at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:49)
        at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:447)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:395)
        ... 48 more

问题是它为什么不从overriden jar中选择org.apache.hive.jdbc.HiveResultSetMetaData.class? find.jsp表示类加载器从覆盖jar中选择它,而在执行查询时,它从其他地方选择。

Java:1.7_45u tomcat:7.0.35

0 个答案:

没有答案