While writing a DB2 stored procedure that invoked a SOAP/WSDL web service using Apache Axis as part of WSIF, I ran into this doozie:
org.apache.commons.discovery.DiscoveryException: No implementation defined for org.apache.commons.logging.LogFactory
Ultimately, it’s caused by a too restrictive lib/security/java.policy
file that ships with DB2.
Wrong Solution
The standard way to define an implementation is to create the following commons-logging.properties
file and place it anywhere in your CLASSPATH (such as the root of a JAR file):
# Default #org.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.LogFactoryImpl # SimpleLog #org.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog # JDK 1.4 logger #org.apache.commons.logging.Log = org.apache.commons.logging.impl.Jdk14Logger # Avalon Toolkit #org.apache.commons.logging.Log = org.apache.commons.logging.impl.LogKitLogger # Log4j (Recommended by Axis) org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger
Alternatively, you can set the org.apache.commons.logging.Log
configuration attribute for LogFactory programmatically.
Right Solution
Solution: Running an Axis SOAP client in Domino [or DB2]
My DB2 is installed into C:Program FilesIBMSQLLIB
1. Copy all your JARs to C:Program FilesIBMSQLLIBjavajdkjrelibext
2. Open C:Program FilesIBMSQLLIBjavajdkjrelibsecurity
3. Open java.policy
4. Add:
permission java.util.PropertyPermission "java.protocol.handler.pkgs", "write";
5. Restart DB2
Thank you very much for this, many people are having this problem, but indeed nowhere else have been the correct solution published.
LikeLike