Working On Java[TM] Management Extensions (JMX[TM)) Using NetBeans IDE

README FIRST
 
  make/netbeans/README for getting started with NetBeans IDE and OpenJDK,
  and workings with OpenJDK NetBeans projects. 

This README focusses on working on the OpenJDK JMX API using NetBeans IDE.

  This NetBeans project for OpenJDK JMX allows you to modify, build, and test
  the JMX API in a standalone manner. It can also be used to generate 
  the JMX API documentation for preview.

  The JMX API does not contain native code. It is a pure java library. 
  You do not need to install all the Java SE sources to work on JMX,
  you only need the following subset:

            make/netbeans/
            src/share/classes/com/sun/jmx/
            src/share/classes/javax/management/
            test/TEST.ROOT
            test/com/sun/management/
            test/java/lang/management/
            test/javax/management/

  If you don't want to build the whole JDK, you will also need a 
  pre-built version of OpenJDK (or JDK 7). Edit your 

            $HOME/.openjdk/build.properties

  file (create it if you don't have one yet) and set the bootstrap.jdk variable 
  point to that JDK:

            bootstrap.jdk=<JDK_7_HOME>

  Then from within NetBeans IDE open the JMX project, and invoke the 
  "Build Project" and "Test Project" target. Note that running all the
  tests for JMX takes a while. The build may also fail if it doesn't 
  find a directory named src/${platform}. This may happen if you haven't
  installed all OpenJDK sources. In this case, you can simply
  create an empty directory with the name expected by the build mechanism.
         
  Which tests are run are defined by the jtreg.test variable declared
  in make/netbeans/jmx/build.properties. Note that JMX tests are all
  placed under test/javax/management/.   test/java/lang/management/
  and test/com/sun/management/ contain some tests that happen to
  use JMX and we therefore recommend to run these tests too.

  If you are working on a JMX fix, don't forget to create a 
  corresponding jtreg unit test under test/javax/management/. 
  You can look at existing tests to see how this is done.

The set of actions defined in this project are:

* Build Project:

  - Compiles JMX API source files and puts the class files under
    build/${platform}-${arch}/classes.

  - Generates a JMX jar file under dist/lib/jmx.jar. To use your modified
    JMX classes instead of the built-in JDK classes you will need
    to put this jar file in front of the bootclasspath:

       java -Xbootclasspath/p:dist/lib/jmx.jar mytestapp.MyAppMainClass

* Generate Javadoc for Project

  - Generates the JMX API Documentation under

    build/${platform}-${arch}/javadoc/jmx.

* Test Project

  - Runs the JMX and Management and Monitoring jtreg unit tests.

  - The results are written under build/${platform}-${arch}/jtreg/jmx
    and the HTML test report can be found at
    build/${platform}-${arch}/jtreg/jmx/JTreport/report.html.

* Clean Project

  - Cleans the files created by this projet under build/ 
    Some files may remain.


IMPORTANT NOTE

  Please make sure to follow carefully the governance rules documented at
  http://openjdk.dev.java.net/

