自己谢了个jar,spring工程的,同时依赖了一些外部的jar。把他们一块放在了D:\test\lib\xx.jar(若干的依赖包)和d:\test\myjar.jar(依赖lib下的包),通过自定义加载器,加载myjar.jar中的main方法执行程序,发现报错:貌似是没有读取我的jar中的spring配置文件,没有注入对象所致。
Exception in thread "main" java.lang.reflect.InvocationTargetException
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 com.tencent.load.AlexClassLoad.main(AlexClassLoad.java:127)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dayHotDao' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)
at
我的自定义classload如下:
public class AlexClassLoad extends URLClassLoader {
private FileInputStream input = null; //文件输入流
private ByteArrayOutputStream out = null; //字节数组输出流
private String[] url = null; //类文件加载路径
private byte[] data = null; //类文件字节码
private String extensionalName = ""; //类文件扩展名
public AlexClassLoad(URL[] urls) throws Exception{
super(urls);
this.url = new String[urls.length];
for (int i = 0; i < urls.length; i++) {
this.url[i] = urls[i].toURI().toString();
}
}
private void setFilePath() {
for (int i = 0; i < this.url.length; i++) {
if (this.url[i].substring(0,4).toLowerCase().equals("file") == true) {
this.url[i] = this.url[i].substring(5);
}
}
}
private byte[] getFileData(String name) {
try {
this.setFilePath();
for (String url : this.url) {
String fileName = url + name.replace('.', '/').concat(".") + this.getExtensionalName();
input = new FileInputStream(new File(fileName));
if (input != null) {
break;
}
}
out = new ByteArrayOutputStream();
data = new byte[1024];
int len = -1;
while ((len = input.read(data)) != -1) {
out.write(data, 0, len);
}
data = out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (input != null)
input.close();
if (out != null)
out.close();
return data;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
protected Class findClassByName(String name) {
try {
byte[] data = this.getFileData(name);
if (data == null) {
return null;
}
return this.defineClass(name, data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public Class loadClass(String name) {
Class c = null;
try {
c = super.loadClass(name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (c == null) //父类默认方法没有加载到指定类时,使用自定义方法查找
c = this.findClassByName(name);
return c;
}
}
求原因?打下帮我改改白~ 加载器不是很懂~
我看到谢了个,轻轻笑了。没别意思啊^-^,帮顶一下
?谢了个~packageorg.lsqt.components.dao.dbutil;
importjava.sql.CallableStatement;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Properties;
importjavax.naming.InitialContext;
importjavax.naming.NamingException;
importjavax.sql.DataSource;
importorg.apache.commons.dbutils.QueryRunner;
importorg.apache.commons.dbutils.handlers.ArrayListHandler;
importorg.apache.commons.lang.StringUtils;
importorg.apache.log4j.Logger;
importorg.lsqt.components.dao.suport.DataRow;
importorg.lsqt.components.dao.suport.DataSet;
importorg.lsqt.components.dao.suport.DataTable;
importorg.lsqt.components.dao.suport.DbHelper;
importorg.lsqt.components.dao.suport.ParamType;
/
<pre>
功能说明:
该执行器优先使用JNDI配置的数据源,其次才是jdbc数据源
该SQL执行器,提供简易并直接的SQL语句操作数据库.
该SQL执行器不依赖于任何第三方的数据源创建
(注:在多个service层内调用多个执行器,没有事务控制)
编写日期:2011-4-21
作者:袁Sky
历史记录
修改日期:2012-3-10
修改人:袁Sky
修改内容:
1.添加JNDI支持
2.添加存储过程执行支持
</pre>
/
publicclassSqlExecutor{
//
privatestaticfinalLoggerLOGGER=Logger.getLogger(SqlExecutor.class);
//
privatestaticStringUSERNAME;
/**/
privatestaticStringPASSWORD;
//
privatestaticStringURL;
/**/
privatestaticStringDRIVERCLASSNAME;
//
privatestaticStringJNDINAME;
/**/
privatestaticDataSourcedataSource;
//
privatestaticbooleanhasJndiDataSource;
//
privatestaticPropertiesproperties=newProperties();
static{
loadConfigFile();
hasJndiDataSource=loadJndiDataSource();
if(hasJndiDataSource==false){
try{
Class.forName(DRIVERCLASSNAME);
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
}
}
privatestaticvoidloadConfigFile(){
try{
<spanstyle="background-color:#E53333;">properties.load(SqlExecutor.class.getResourceAsStream("/dbconfig.properties"));
LOGGER.debug(properties);
USERNAME=properties.getProperty("username");
PASSWORD=properties.getProperty("password");
URL=properties.getProperty("url");
DRIVERCLASSNAME=properties.getProperty("driverClassName");
JNDINAME=properties.getProperty("jndiName");
}catch(Exceptione){
try{
LOGGER.error("notfounddataSource'sconfigurationfile");
thrownewException(e.getMessage());
}catch(Exceptione1){
e1.printStackTrace();
}
}
}
privatestaticbooleanloadJndiDataSource(){
try{
if(StringUtils.isNotEmpty(JNDINAME)){
InitialContextcontext=newInitialContext();
dataSource=(DataSource)context.lookup(JNDINAME);
}
}catch(NamingExceptione){
LOGGER.warn("havenoJNDIconfigfound");
returnfalse;
}
returnfalse;
}
privatestatic ConnectiongetConnection(){
try{
if(hasJndiDataSource){
LOGGER.debug("database'sconnectionfromJNDIdataSource");
returndataSource.getConnection();
}else{
Connectionconn=DriverManager.getConnection(URL,USERNAME,PASSWORD);
LOGGER.debug("database'sconnectionfromDriverManager");
returnconn;
}
}catch(SQLExceptione){
LOGGER.debug(e);
e.printStackTrace();
}
returnnull;
}
//-------------------------------------------------------------------------------
/
处理参数占位符字符串
@paramparamValues paramValues
<aclass='referer'target='_blank'>@returnprocessprocedureParamHold
/
privatestaticStringprocessProcedureParamHold(Object[]paramValues){
StringholdString="";
intholdLength=paramValues.length;
for(inti=0;i<holdLength;i++){
if(i!=holdLength-1){
holdString="?,"+holdString;
}else{
holdString=holdString+"?";
}
}
LOGGER.debug(holdString);
returnholdString;
}
/**
执行存储过程,返回结果集
@paramprocedureName存储过程名称
<aclass='referer'target='_blank'>@returnDataSet
/
publicstaticDataSetexecuteProcedure(finalStringprocedureName){
finalDataSetDATASET=newDataSet();
CallableStatementcstmt=null;
ResultSetrs=null;
Connectioncon=null;
try{
con=getConnection();
cstmt=con.prepareCall("{call"+procedureName+"()}");
booleanhasResults=cstmt.execute();
while(hasResults){
DataTabledt=newDataTable();
rs=cstmt.getResultSet();
intcolCount=rs.getMetaData().getColumnCount();
while(rs.next()){
DataRowrow=newDataRow();
for(inti=0;i<colCount;i++){
row.add(rs.getObject(i+1));
}
dt.add(row);
}
DATASET.add(dt);
hasResults=cstmt.getMoreResults();
}
}catch(Exceptione){
LOGGER.error("procedureexecutefail==>"+e.getMessage());
returnnull;
}finally{
DbHelper.destroy(con,cstmt,rs);
}
returnDATASET;
}
/**
执行只带输入参数的存储过程
@paramprocedureName 存储过程名称
@paramparamValues入参值
<aclass='referer'target='_blank'>@returnDataSet数据集
/
publicstaticDataSetexecuteProcedure(finalStringprocedureName,finalObject[]paramValues){
finalDataSetDATASET=newDataSet();
CallableStatementcstmt=null;
ResultSetrs=null;
Connectioncon=null;
try{
con=getConnection();
cstmt=con.prepareCall("{call"+procedureName+"("+processProcedureParamHold(paramValues)+")}");
booleanhasResults=cstmt.execute();
while(hasResults){
DataTabledt=newDataTable();
rs=cstmt.getResultSet();
intcolCount=rs.getMetaData().getColumnCount();
while(rs.next()){
DataRowrow=newDataRow();
for(inti=0;i<colCount;i++){
row.add(rs.getObject(i+1));
}
dt.add(row);
}
DATASET.add(dt);
hasResults=cstmt.getMoreResults();
}
}catch(Exceptione){
LOGGER.error("procedureexecutefail==>"+e.getMessage());
returnnull;
}finally{
DbHelper.destroy(con,cstmt,rs);
}
returnDATASET;
}
/
存储过程调用(返回结果集+输出参数+执行系列更新语句),调用时显示指定入参和输出参数据数据类型
@paramprocedureName存储过程名称
@paramparamValues入参值和输出参数的值
@paramparamValueTypes储存过程入参和输出参数据的数据类型:ParamType.String待
<aclass='referer'target='_blank'>@returnDataSet数据集
/
publicstaticDataSetexecuteProcedure(finalStringprocedureName,finalObject[]paramValues,finalint[]paramValueTypes){
if(paramValues.length!=paramValueTypes.length){
LOGGER.error("procedureexecutefail,Parametersandparametertypesvalue,thelengthnotequal ");
returnnull;
}
finalDataSetDATASET=newDataSet();
StringsqlHold=processProcedureParamHold(paramValues);
CallableStatementcstmt=null;
ResultSetrs=null;
Connectioncon=null;
try{
con=getConnection();
cstmt=con.prepareCall("{call"+procedureName+"("+sqlHold+")}");
List<Integer>outputParamIndex=newArrayList<Integer>();
for(inti=0;i<paramValues.length;i++){
if(paramValues[i]==ParamType.HOLDER){
cstmt.registerOutParameter(i+1,paramValueTypes[i]);
outputParamIndex.add(i+1);
}else{
cstmt.setObject(i+1,paramValues[i]);
}
}
booleanhasResults=cstmt.execute();
//处理输出参数值
List<Object>outputValues=newArrayList<Object>();
for(inti=0;i<outputParamIndex.size();i++){
outputValues.add(cstmt.getObject(outputParamIndex.get(i)));
}
DATASET.setOutputParams(outputValues.toArray(newObject[outputValues.size()]));
while(hasResults){
DataTabledt=newDataTable();
rs=cstmt.getResultSet();//---取得第一个结果集
intcolCount=rs.getMetaData().getColumnCount();
while(rs.next()){
DataRowrow=newDataRow();
for(inti=0;i<colCount;i++){
row.add(rs.getObject(i+1));
}
dt.add(row);
}
DATASET.add(dt);
hasResults=cstmt.getMoreResults();
}
}catch(Exceptione){
LOGGER.error("executeprocedurefail==>"+e.getMessage());
returnnull;
}finally{
DbHelper.destroy(con,cstmt,rs);
}
returnDATASET;
}
/**
执行更新的SQL语句
@paramsql
<aclass='referer'target='_blank'>@return
/
publicstaticbooleanexecuteSql(Stringsql){
QueryRunnerrun=newQueryRunner();
Connectionconn=getConnection();
try{
returnrun.update(conn,sql)>0;
}catch(SQLExceptionex){
LOGGER.error("executesqlfail==>"+ex.getMessage());
returnfalse;
}finally{
DbHelper.destroy(conn,null,null);
}
}
publicstaticbooleanexecuteSql(Stringsql,Object[]paramValues){
QueryRunnerrun=newQueryRunner();
Connectionconn=getConnection();
try{
returnrun.update(conn,sql,paramValues)>0;
}catch(SQLExceptionex){
LOGGER.error("executesqlfail==>"+ex.getMessage());
returnfalse;
}finally{
DbHelper.destroy(conn,null,null);
}
}
/**
批量执行SQL更新语句
@paramsql带占位符的SQL语句
@paramdataTable参数数据表格
/
publicstaticbooleanexecuteSql(Stringsql,Object[][]dataTable){
QueryRunnerrun=newQueryRunner();
Connectionconn=getConnection();
try{
returnrun.batch(conn,sql,dataTable).length>0;
}catch(SQLExceptionex){
LOGGER.debug("executesqlfail==>"+ex.getMessage());
returnfalse;
}
finally{
DbHelper.destroy(conn,null,null);
}
}
/**
执行查询语句,返回二维结果集
@paramsql
<aclass='referer'target='_blank'>@return
<aclass='referer'target='_blank'>@throwsSQLException
/
publicstaticList<Object[]>executeSqlQuery(Stringsql){
QueryRunnerrun=newQueryRunner();
Connectionconn=getConnection();
try{
return run.query(conn,sql,newArrayListHandler(){
@Override
protectedObject[]handleRow(ResultSetrs)throwsSQLException{
returnsuper.handleRow(rs);
}
});
}catch(SQLExceptionex){
LOGGER.error("executesqlfail==>"+ex.getMessage());
returnnull;
}finally{
DbHelper.destroy(conn,null,null);
}
}
/**
执行带"?"占位符的查询语句,返回二维结果集
@paramsql
@paramparamValues
<aclass='referer'target='_blank'>@return
<aclass='referer'target='_blank'>@throwsSQLException
/
publicstaticList<Object[]>executeSqlQuery(Stringsql,Object[]paramValues){
QueryRunnerrun=newQueryRunner();
Connectionconn=getConnection();
try{
returnrun.query(conn,sql,newArrayListHandler(){
@Override
protectedObject[]handleRow(ResultSetrs)throwsSQLException{
returnsuper.handleRow(rs);
}
},paramValues);
}catch(SQLExceptionex){
LOGGER.error("executesqlfail==>"+ex.getMessage());
returnnull;
}finally{
DbHelper.destroy(conn,null,null);
}
}
}
谢谢阿,我这个自定义加载怎么搞定那~就是读取了配置文件,怎么跟spring整合那~<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--wicket的web框架用-->
<beanid="consoleApplication"class="org.lsqt.content.web.wicket.ConsoleApplication"/>
<!--spring加载xml属性配置-->
<beanclass="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<propertyname="location"value="classpath:springConfig.properties"/>
</bean>
<!--common-->
<importresource="applicationContext-dataSource.xml"/>
<importresource="applicationContext-hibernate.xml"/>
<importresource="applicationContext-aop.xml"/>
<importresource="applicationContext-ehcache.xml"/>
<importresource="application-spring-mvc.xml"/>
<spanstyle="background-color:#E53333;"><context:annotation-config/>
<spanstyle="background-color:#E53333;"> <context:component-scanbase-package="org.lsqt"/>
</beans>
不同myjar.jar由JDK的ApplicationClassLoader加载而你自己定义的classLoader去加载xx.jar那么在myjar中是找不到xx.jar中的东西的建议学习一下OSGi,对classLoader应用的典型好的我看看谢谢阿
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。