I think it's rather technical why we get one exception or the other. The VerifyError would happen during linkage, while the no class def would happen during loading. The VerifyError was in a constructor. The other one might be in a different location. You'd probably get an ExceptionInInitializationError if it happened inside the static block for instance.


On 16 July 2014 09:18, Remko Popma <remko.popma@gmail.com> wrote:
Hm... Good point. I will remove the Environment class and put a try/catch Throwable around the Server.reregisterMBeansAfterReconfigure invocation.


On Wed, Jul 16, 2014 at 11:02 PM, Gary Gregory <garydgregory@gmail.com> wrote:
Yeah, big mystery. I'm not sure we should have code like "if ! isAndroid()..." It might be better to // comment and catch errors/exceptions because who know how Android will change.

Gary


On Wed, Jul 16, 2014 at 9:58 AM, Remko Popma <remko.popma@gmail.com> wrote:
But beats me why the JNDI stuff would throw a VerifyError and the JMX stuff only a NoClassDefFoundError...


On Wed, Jul 16, 2014 at 10:49 PM, Remko Popma <remko.popma@gmail.com> wrote:
I did think about that but if you look at the stack trace it is able to load the Server class, so I think we're okay:

    java.lang.NoClassDefFoundError: java.lang.management.ManagementFactory
            at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:118)
            at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:369)



On Wed, Jul 16, 2014 at 10:41 PM, Gary Gregory <garydgregory@gmail.com> wrote:
I do not think this is going to work. See my fix for the JNDI lookup loading.

Because you have a hard reference in the LoggerContext class to our JMX Server class, you still have a dependency on JMX. We need to refer to our JMX Server class dynamically, using reflection for example.

Gary
 

---------- Forwarded message ----------
From: <rpopma@apache.org>
Date: Wed, Jul 16, 2014 at 9:31 AM
Subject: svn commit: r1611003 - in /logging/log4j/log4j2/trunk: log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java log4j-core/src/main/java/org/apache/logging/log4j/core/util/Environment.java src/changes/changes.xml
To: commits@logging.apache.org


Author: rpopma
Date: Wed Jul 16 13:31:07 2014
New Revision: 1611003

URL: http://svn.apache.org/r1611003
Log:
LOG4J2-716: automatically disable log4j JMX when detecting we are running on Android

Added:
    logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Environment.java   (with props)
Modified:
    logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
    logging/log4j/log4j2/trunk/src/changes/changes.xml

Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java?rev=1611003&r1=1611002&r2=1611003&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java Wed Jul 16 13:31:07 2014
@@ -41,6 +41,7 @@ import org.apache.logging.log4j.core.con
 import org.apache.logging.log4j.core.config.Reconfigurable;
 import org.apache.logging.log4j.core.jmx.Server;
 import org.apache.logging.log4j.core.util.Assert;
+import org.apache.logging.log4j.core.util.Environment;
 import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.message.MessageFactory;
 import org.apache.logging.log4j.spi.AbstractLogger;
@@ -365,10 +366,12 @@ public class LoggerContext extends Abstr

         firePropertyChangeEvent(new PropertyChangeEvent(this, PROPERTY_CONFIG, prev, config));

-        try {
-            Server.reregisterMBeansAfterReconfigure();
-        } catch (final Exception ex) {
-            LOGGER.error("Could not reconfigure JMX", ex);
+        if (!Environment.isAndroid()) { // LOG4J2-716: Android has no java.lang.management
+            try {
+                Server.reregisterMBeansAfterReconfigure();
+            } catch (final Exception ex) {
+                LOGGER.error("Could not reconfigure JMX", ex);
+            }
         }
         return prev;
     }

Added: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Environment.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Environment.java?rev=1611003&view=auto
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Environment.java (added)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Environment.java Wed Jul 16 13:31:07 2014
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+
+package org.apache.logging.log4j.core.util;
+
+/**
+ * Runtime environment-related utility methods.
+ */
+public final class Environment {
+    private Environment() {
+    }
+
+    /**
+     * Returns {@code true} if we are running on Android, {@code false} otherwise
+     * @return {@code true} if system property "java.specification.vendor" contains "android"
+     */
+    public static boolean isAndroid() {
+        return System.getProperty("java.specification.vendor", "x").toLowerCase().contains("android");
+    }
+}

Propchange: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Environment.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1611003&r1=1611002&r2=1611003&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Wed Jul 16 13:31:07 2014
@@ -22,6 +22,9 @@
   </properties>
   <body>
     <release version="?" date="2014-mm-dd" description="?">
+      <action issue="LOG4J2-716" dev="popmarem" type="fix">
+        Automatically disable log4j JMX when detecting we are running on Android.
+      </action>
       <action issue="LOG4J2-657" dev="popmarem" type="fix" due-to="Stefan Wehner">
         Fixed AbstractDatabaseManager to close connection on writeInternal error.
       </action>





--





--




--
Matt Sicker <boards@gmail.com>