3

I am trying to implement simple JMX Client/Server using com.j256.simplejmx. I want to spy my objects using Web Browser. I copied a really simple piece of code:

package com.my.package.jmx;

import com.j256.simplejmx.web.JmxWebServer;

public class JMXServer {

    public static void main(String[] args) throws Exception  {

        JmxWebServer jmxWebServer = new JmxWebServer(8123);
        jmxWebServer.start();
    }

}

When I run it I have got an exception:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/util/thread/ThreadPool
    at com.my.package.jmx.JMXServer.main(JMXServer.java:9)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.util.thread.ThreadPool
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

I added this to my pom.xml:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-util</artifactId>
    <version>9.1.3.v20140225</version>
</dependency>

I run it once again and I have got an another excpetion:

Ex

ception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/server/AbstractConnector
    at com.my.package.jmx.JMXServer.main(JMXServer.java:9)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.server.AbstractConnector
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more 

So once again, I update my pom.xml:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.1.3.v20140225</version>
</dependency>

And it gives me an error once again:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/server/nio/SelectChannelConnector
    at com.mu.package.jmx.JMXServer.main(JMXServer.java:9)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.server.nio.SelectChannelConnector
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

and I cannot find any solution for that. What else I should add to my pom.xml file? Maybe it is an issue with versions of dependencies?

Thank you in advance.


I edited my pom.xml

<project...> 

    <properties>
        <jetty-version>8.1.9.v20130131</jetty-version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.j256.simplejmx</groupId>
            <artifactId>simplejmx</artifactId>
            <version>1.8</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-util</artifactId>
            <version>${jetty-version}</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>${jetty-version}</version>
            <optional>true</optional>
        </dependency>

    </dependencies>

</project>

Now, I can run this server:

INFO  Server - jetty-8.1.9.v20130131
INFO  AbstractConnector - Started SelectChannelConnector@0.0.0.0:8123

but when I go to my Web Browser and I put:

localhost:8123

it thows an exception:

WARN  nio - 
java.lang.SecurityException: class "javax.servlet.AsyncContext"'s signer information does not match signer information of other classes in the same package
    at java.lang.ClassLoader.checkCerts(Unknown Source)
    at java.lang.ClassLoader.preDefineClass(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.jetty.server.AbstractHttpConnection.<init>(AbstractHttpConnection.java:157)
    at org.eclipse.jetty.server.AsyncHttpConnection.<init>(AsyncHttpConnection.java:50)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.newConnection(SelectChannelConnector.java:285)
    at org.eclipse.jetty.server.nio.SelectChannelConnector$ConnectorSelectorManager.newConnection(SelectChannelConnector.java:325)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.newEndPoint(SelectChannelConnector.java:272)
    at org.eclipse.jetty.server.nio.SelectChannelConnector$ConnectorSelectorManager.newEndPoint(SelectChannelConnector.java:331)
    at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.createEndPoint(SelectorManager.java:841)
    at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:496)
    at org.eclipse.jetty.io.nio.SelectorManager$1.run(SelectorManager.java:290)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Unknown Source)
ruhungry
  • 4,506
  • 20
  • 54
  • 98
  • 1
    Thanks for your edit @Gray. I was not able to use this tag... **EDIT** ouch, you've just added it. Good idea ;) – ruhungry Apr 09 '14 at 14:01
  • Can I ask how you found out that simplejmx does JMX/HTTP publishing? – Gray Apr 09 '14 at 14:05
  • Of course :) few days ago, I asked a question about JMX http://stackoverflow.com/q/22789428/1021970 - you put an answer. I decided to use `simplejmx` in my project. I read all the links you put in your answer and here http://256.com/sources/simplejmx/ is a section **Expose JMX Beans Over HTTP for Web Browsers** – ruhungry Apr 09 '14 at 14:14

1 Answers1

4

Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.server.nio.SelectChannelConnector

So right now SimpleJMX has an optional dependency for 8.1.9.v20130131 Jetty to support publishing JMX over web/HTTP. If you check out the pom.xml you'll see:

<jetty-version>8.1.9.v20130131</jetty-version>
...
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>${jetty-version}</version>
    <optional>true</optional>
</dependency>

Can you try this version of Jetty? I'm not sure there is a way for me to support both 8.X.X and 9.X.X but I'll look into it.

Gray
  • 115,027
  • 24
  • 293
  • 354
  • Ok, it helped a little bit, but now, when I run my server and I am trying to access it by Web Browser it throws an exception. I edited my post. – ruhungry Apr 09 '14 at 14:22
  • Yeah it's sort of not a good idea to be changing the question. Hard to keep a valid answer @GirlyGirl. I think now you have a problem with different versions of the same class in your code. http://stackoverflow.com/questions/19090127/java-lang-securityexception-with-two-conflicting-versions-of-javax-servlet-servl – Gray Apr 09 '14 at 14:26
  • 1
    FYI: `javax.servlet.AsyncContext` is in the javax.servlet package so that's the one that you are getting different versions of @GirlyGirl. – Gray Apr 09 '14 at 14:31
  • 1
    Ok @Gray, it fixed it. I removed a dependency: **javax.servlet**. Thank you very much. I will be working with your `simplejmx` and I hope it will be working fine really soon ;) – ruhungry Apr 09 '14 at 14:41
  • 1
    Please ping me with any questions/comments @GirlyGirl http://256.com/gray/email/ – Gray Apr 09 '14 at 14:44