The problem is we don't know what's missing and we can't tell what's missing. 
I'm not even convinced that the problem IS a missing dependency. Whenever I've 
seen a missing dependency, the NoClassDefFoundError was for the actual missing 
dependency, not for the class that depended on it. This NoClassDefFoundError in 
this case is for org.mongodb.MongoException, which is 100% for certain without 
any question whatsoever correctly placed on the classpath.

Nick

On Aug 17, 2013, at 12:32 AM, Gary Gregory wrote:

> Why not try to create the proper dependencies and see if we can get it 
> working? How else can we unit test otherwise?
> 
> Gary
> 
> 
> On Sat, Aug 17, 2013 at 12:49 AM, Nick Williams 
> <nicho...@nicholaswilliams.net> wrote:
> That approach concerns me. Catching RuntimeException essentially opens it up 
> to thousands of possible exceptions that could be the cause, as opposed to 
> looking for that exact cause. I suppose I don't have a choice, though. This 
> apparently just isn't going to work.
> 
> Definitely agreed that there is too much going on for a simple Exception 
> class.
> 
> :-/
> 
> Nick
> 
> 
> On Aug 16, 2013, at 11:45 PM, Ralph Goers wrote:
> 
>> After following the chain of stuff that gets brought in via BSONObject I 
>> still recommend the approach in my other email of just catching 
>> RuntimeException.  A bunch of other classes are being referenced, one of 
>> which is creating a static Logger from java.util.logging. I have no idea why 
>> that might fail but there is just way too much going on for a simple 
>> Exception class.
>> 
>> Ralph
>> 
>> On Aug 16, 2013, at 9:26 PM, Nick Williams wrote:
>> 
>>> https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/DB.java
>>> 
>>> That also shows an import for org.bson.BSONObject, but the tests still run 
>>> with just DB and no MongoException. org.bson is in the 
>>> org.mongodb:mongo-java-driver JAR file. So, no, that's not the problem. 
>>> There's something else...
>>> 
>>> Nick
>>> 
>>> On Aug 16, 2013, at 11:20 PM, Ralph Goers wrote:
>>> 
>>>> https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/MongoException.java
>>>>  shows an import for org.bson.BSONObject.  The pom.xml for 
>>>> mongo-java-driver doesn't contain a transitive dependency for that and mvn 
>>>> dependency:tree on core doesn't show it.
>>>> 
>>>> Ralph
>>>> 
>>>> 
>>>> On Aug 16, 2013, at 3:48 PM, Nick Williams wrote:
>>>> 
>>>>> Guys, I'm having a hard time with this simple fix that should have taken 
>>>>> five minutes. I'm getting test failures due to NoClassDefFoundErrors that 
>>>>> shouldn't happen.
>>>>> 
>>>>> Here are the tests in error:
>>>>>   CategoryTest.setupClass:52 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testTraceWithException:415 ? NoClassDefFound 
>>>>> com/mongodb/MongoExcep...
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testLog:459 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testRB1:295 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testRB2:314 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testRB3:334 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testTrace:388 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testAdditivity1:119 ? NoClassDefFound 
>>>>> com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testAdditivity2:144 ? NoClassDefFound 
>>>>> com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testAdditivity3:183 ? NoClassDefFound 
>>>>> com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testIsTraceEnabled:443 ? NoClassDefFound 
>>>>> com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.testExists:355 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggingTest.setupClass:44 ? NoClassDefFound com/mongodb/MongoException
>>>>>   LoggingTest.cleanupClass:49 NullPointer
>>>>> 
>>>>> Here's the code I added:
>>>>> 
>>>>>                 try {
>>>>>                     if (!database.authenticate(username, 
>>>>> password.toCharArray())) {
>>>>>                         LOGGER.error("Failed to authenticate against 
>>>>> MongoDB server. Unknown error.");
>>>>>                     }
>>>>>                 } catch (MongoException e) {
>>>>>                     LOGGER.error("Failed to authenticate against MongoDB: 
>>>>> " + e.getMessage(), e);
>>>>>                 } catch (IllegalStateException e) {
>>>>>                     LOGGER.error("Factory-supplied MongoDB database 
>>>>> connection already authenticated with different" +
>>>>>                             "credentials but lost connection.");
>>>>>                 }
>>>>> 
>>>>> Problem is, "database" is an instance of com.mongodb.DB, which is in the 
>>>>> same JAR as com.mongodb.MongoException. If I remove this code, the tests 
>>>>> pass. How is this possible? The DB instance is there with or without this 
>>>>> new code, which means the JAR is on the classpath, which means 
>>>>> MongoException should be on the classpath.
>>>>> 
>>>>> Very confused...
>>>>> 
>>>>> Nick
>>>>> 
>>>>> On Aug 16, 2013, at 5:13 PM, Gary Gregory wrote:
>>>>> 
>>>>>> Thank you for the update Nick!
>>>>>> :)
>>>>>> Gary
>>>>>> 
>>>>>> 
>>>>>> On Fri, Aug 16, 2013 at 5:39 PM, Nick Williams 
>>>>>> <nicho...@nicholaswilliams.net> wrote:
>>>>>> Answers inline.
>>>>>> 
>>>>>> On Aug 14, 2013, at 2:10 AM, YuCheng Ting wrote:
>>>>>> 
>>>>>>> Hi all,
>>>>>>> 
>>>>>>> I use beta8 log4j2 and wrote log4j2.xml like example in document 
>>>>>>> (http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender
>>>>>>>  ):
>>>>>>> 
>>>>>>> 
>>>>>>> <appenders>
>>>>>>>     <NoSql name="databaseAppender">
>>>>>>>         <MongoDb databaseName="applicationDb" 
>>>>>>> collectionName="applicationLog"
>>>>>>>             server="mongo.example.org"
>>>>>>>             username="loggingUser" password="abc123" />
>>>>>>>     </NoSql>
>>>>>>> </appenders>
>>>>>> 
>>>>>> Yep. That's correct.
>>>>>> 
>>>>>>> but I get the two exception:
>>>>>>> 
>>>>>>> 1, "can't serialize class org.apache.logging.log4j.Level" exception in 
>>>>>>> (BasicBSONEncoder.java:270), I read the code and add follow code in my 
>>>>>>> project before logging, it gone.
>>>>>>> 
>>>>>>>         BSON.addEncodingHook(org.apache.logging.log4j.Level.class, new 
>>>>>>> Transformer() {
>>>>>>>             @Override
>>>>>>>             public Object transform(Object o) {
>>>>>>>                 return o.toString();
>>>>>>>             }
>>>>>>>         });
>>>>>> 
>>>>>> This bug was reported and fixed a few weeks ago. The fix will be in the 
>>>>>> next version, or you can compile locally. 
>>>>>> https://issues.apache.org/jira/browse/LOG4J2-330
>>>>>> 
>>>>>>> 2, “not authorized for insert test.log”, because my MongoDB need auth 
>>>>>>> to write, but the the "username" and "password" attributes in 
>>>>>>> log4j2.xml is nearly useless, after I read source code, found it NOT 
>>>>>>> auth in 
>>>>>>> 
>>>>>>> org.apache.logging.log4j.core.appender.db.nosql.mongo.MongoDBProvider.createNoSQLProvider
>>>>>>> source code line 181 after check username and password and 
>>>>>>> com.mongodb.DB.authenticate never be called.
>>>>>> 
>>>>>> This is a bug. I'm reporting it and fixing it now. The fix will be in 
>>>>>> the next version, or you can compile locally (after I get the change 
>>>>>> committed, of course).
>>>>>> 
>>>>>>> so I change log4j2.xml :
>>>>>>> 
>>>>>>> <NoSql name="mongodb">
>>>>>>>              <MongoDb collectionName="log" databaseName="test"
>>>>>>>                          
>>>>>>> factoryClassName="com.yuchs.test.log4j.MainTest"
>>>>>>>                         factoryMethodName="getMongoClient" />
>>>>>>> </NoSql>
>>>>>>> 
>>>>>>> and create MongoClient and call com.mongodb.DB.authenticate method in 
>>>>>>> com.yuchs.test.log4j.MainTest.getMongoClient.
>>>>>>> 
>>>>>>> 
>>>>>>> This is my question:
>>>>>>> 
>>>>>>> 1, Why not add BSON.addEncodingHook code into log4j2 project to avoid 
>>>>>>> basic exception ? or another rule of method I don't know ?
>>>>>>> 
>>>>>>> 2, Why not auth DB in log4j2 project if password and username is set in 
>>>>>>> log4j2.xml ? or another rule of method I don't know ?
>>>>>>> 
>>>>>>> Thanks everyone!
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org 
>>>>>> Java Persistence with Hibernate, Second Edition
>>>>>> JUnit in Action, Second Edition
>>>>>> Spring Batch in Action
>>>>>> Blog: http://garygregory.wordpress.com 
>>>>>> Home: http://garygregory.com/
>>>>>> Tweet! http://twitter.com/GaryGregory
>>>>> 
>>>> 
>>> 
>> 
> 
> 
> 
> 
> -- 
> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org 
> Java Persistence with Hibernate, Second Edition
> JUnit in Action, Second Edition
> Spring Batch in Action
> Blog: http://garygregory.wordpress.com 
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory

Reply via email to