Chargement via un URLClassLoader
Bonjour,
Je suis tombé sur quelque chose qui me laisse perplexe ! :roll:
Dans le cadre d'un test, j'ai une classe java (un thread) qui effectue une édition crystal report avec export PDF
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
package com.test.crystal;
// je passe les imports :)
public class ReportEdition extends Thread {
/** Attribut de table 'Connection String' */
private static final String ATT_CONNECTIONSTRING = "Connection String";
/** Attribut de table 'Local XML File' */
private static final String ATT_LOCAL_FILE = "Local XML File";
/**
* {@inheritDoc}
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
System.out.println("Lancement du thread " + getName());
ReportClientDocument rcd = new ReportClientDocument();
try {
String report = "C:/Editions/test/report.rpt";
rcd.setLocale(Locale.ENGLISH);
rcd.open(report, 0);
// rcd.getDataDefController().getParameterFieldController().
DatabaseController dc = rcd.getDatabaseController();
for (Iterator<?> iter = dc.getDatabase().getTables().iterator(); iter.hasNext();) {
ITable table = (ITable) iter.next();
PropertyBag atts = table.getConnectionInfo().getAttributes();
String varCmdConnect = atts.getStringValue(ATT_CONNECTIONSTRING);
String varSchConnect = varCmdConnect.substring(varCmdConnect.indexOf(';'));
String varNomTable = table.getName();
varNomTable = varNomTable.substring(varNomTable.indexOf('/') + 1);
String varXML_Fic = "C:/Editions/test/source_" + varNomTable + ".xml";
varCmdConnect = ATT_LOCAL_FILE + "=s(" + varXML_Fic + ")" + varSchConnect;
atts.putStringValue(ATT_CONNECTIONSTRING, varCmdConnect);
atts.putStringValue(ATT_LOCAL_FILE, varXML_Fic);
// atts.putStringValue("Local XML File", varXML_Fic);
dc.setTableLocation(table, table);
}
try {
exportReportToFile(rcd, ReportExportFormat.PDF, "C:/Editions/test/test" + System.nanoTime() + getName() + ".pdf");
} catch (ImpressionException e) {
e.printStackTrace();
}
System.out.println("Fin du thread " + getName());
} catch (Exception e) {
System.out.println("Fin en erreur du thread " + getName());
e.printStackTrace();
} finally {
try {
rcd.close();
} catch (ReportSDKException e) {
e.printStackTrace();
}
}
}
public static void exportReportToFile(ReportClientDocument report, ReportExportFormat format, File cible) throws ReportSDKException,
ImpressionException {
ByteArrayInputStream byteArrayInputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
FileOutputStream fileOutputStream = null;
try {
try {
byteArrayInputStream = (ByteArrayInputStream) report.getPrintOutputController().export(format);
} catch (Throwable re) {
LogUtils.logFatal("Erreur lors de l'export crystal pour le format " + format);
byteArrayInputStream = (ByteArrayInputStream) report.getPrintOutputController().export(format);
}
byte byteArray[] = new byte[byteArrayInputStream.available()];
// Create a new file that will contain the exported result.
fileOutputStream = new FileOutputStream(cible);
byteArrayOutputStream = new ByteArrayOutputStream(byteArrayInputStream.available());
int x = byteArrayInputStream.read(byteArray, 0, byteArrayInputStream.available());
byteArrayOutputStream.write(byteArray, 0, x);
byteArrayOutputStream.writeTo(fileOutputStream);
} catch (IOException e) {
throw new ImpressionException("Erreur lors de l'export fichier", e);
} finally {
try {
if (byteArrayInputStream != null) {
byteArrayInputStream.close();
}
} catch (IOException e) {
}
try {
if (byteArrayOutputStream != null) {
byteArrayOutputStream.close();
}
} catch (IOException e) {
}
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
}
}
}
} |
jusque la tout fonctionne correctement !
J'ai voulu isoler le traitement dans URLClassLoader et ai remplacé le new par :
Code:
1 2
|
loader.loadClass("com.test.crystal.ReportEdition").newInstance() |
j'ai aussi supprimer les libs crystal du classpath d'origine et les ai ajouté à mon URLClassLoader.
mais là c'est le drame, je me retrouve avec une exception :?, alors que la seul différence est le classLoader :
Citation:
- org.apache.xmlbeans.XmlException: Thread Thread-0: The 0th supplied input is not a schema document: its type is N=
at org.apache.xmlbeans.impl.schema.SchemaTypeSystemCompiler.compile(SchemaTypeSystemCompiler.java:211)
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.apache.xmlbeans.XmlBeans.compileXmlBeans(XmlBeans.java:665)
at org.apache.xmlbeans.XmlBeans.compileXsd(XmlBeans.java:551)
at com.crystaldecisions.data.xml.t.if(Unknown Source)
at com.crystaldecisions.data.xml.t.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.CRDB_XMLImpl.DbLogonServer(Unknown Source)
at com.crystaldecisions.reports.queryengine.driverImpl.a.if(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.new(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.byte(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.j.a(Unknown Source)
at com.crystaldecisions.reports.dataengine.bb.try(Unknown Source)
at com.crystaldecisions.reports.common.aw.a(Unknown Source)
at com.crystaldecisions.reports.common.ah.a(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)
- org.apache.xmlbeans.XmlException: Thread Thread-0: The 0th supplied input is not a schema document: its type is N=
at com.crystaldecisions.data.xml.t.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.CRDB_XMLImpl.DbLogonServer(Unknown Source)
at com.crystaldecisions.reports.queryengine.driverImpl.a.if(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.new(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.byte(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.j.a(Unknown Source)
at com.crystaldecisions.reports.dataengine.bb.try(Unknown Source)
at com.crystaldecisions.reports.common.aw.a(Unknown Source)
at com.crystaldecisions.reports.common.ah.a(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)
- XmlDriverException happened in the function CRDB_XMLImpl.DbLogonServer() when logoning from Local
- Failed to load the resource 'XmlError' from the bundle java.util.PropertyResourceBundle@16cbd97.
java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key XmlError
at java.util.ResourceBundle.getObject(Unknown Source)
at java.util.ResourceBundle.getObject(Unknown Source)
at java.util.ResourceBundle.getString(Unknown Source)
at com.crystaldecisions.reports.common.CrystalResources.loadString(Unknown Source)
at com.crystaldecisions.reports.common.CrystalResources.loadMessage(Unknown Source)
at com.crystaldecisions.reports.common.bk.a(Unknown Source)
at com.crystaldecisions.reports.common.bk.a(Unknown Source)
at com.crystaldecisions.reports.common.bk.a(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)
- JRCAgent1 detected an exception: XmlError
at com.crystaldecisions.sdk.occa.report.lib.ReportSDKException.throwReportSDKException(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)
Fin en erreur du thread Thread-0
com.crystaldecisions.sdk.occa.report.lib.ReportSDKException: XmlError---- Error code:-2147467259 Error code name:failed
at com.crystaldecisions.sdk.occa.report.lib.ReportSDKException.throwReportSDKException(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)
- JRCAgent1 received request: closeServerAgent
- JRCAgent1 has cleaned up and closed down the report
Quelqu'un aurait il une explication logique a ce problème ?
Merci d'avance !