"Magali & Edouard sur Free" <[EMAIL PROTECTED]> writes:
> As I understand, the Java XSLT API performs introspection by creating an
> instance of the 'javax.xml.transform.TransformerFactory' abstract class, and
> by looking at the Java system 'javax.xml.transform.TransformerFactory'
> property.
>
> My question is: how to make all this work?
>
> A piece of answer would be: how to force the underlying class loader of the
> Ant 'typedef' task to load the whole content of a jar (even those that may
> be used by introspection), instead of just loading the classes declared and
> discovered at compile time?
>
> I really need to separate my XSLT implementation and my task from Ant 'lib'
> directory!
The problem is not that the whole content of the jar is loaded (it is !) - but
that classes present in JRE rt.jar are not able to find the resource
META-INF/services/javax.xml.transform.TransformerFactory in its only visible
ClassLoader: the system ClassLoader.
You may want to read javax.xml.transform.TransformerFactory.newInstance() to
know more about the factory loading.
The only work-around I see is to short-circuit the API when you call the
TransformerFactory in your Ant task with the following code:
. is = YourTask.class.getClassLoader()
.getResourceAsStream("META-INF/services/javax.xml.transform.TransformerFactory")
. Read the Class name from the InputStream
. Load the corresponding Class object from YourTask.class.getClassLoader()
. Do a Class.newInstance() => result is a
javax.xml.transform.TransformerFactory
. Call newTransformer on that Factory
That way, you load the correct implementation class name from the Ant typedef
ClassLoader and use directly the javax.xml.transform factory !
Warning: I do not test the code myself. I'm interested to know if you
succeeded.
Hope this helps
Regards
--
Yves Martin
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]