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