changeset 238:55773172374f

Bug 3219: Upload artifacts to the Maven Central Repository Reviewed-by: yasuenag GitHub: https://github.com/HeapStats/heapstats/pull/105
author KUBOTA Yuji <kubota.yuji@lab.ntt.co.jp>
date Mon, 26 Jun 2017 21:05:32 +0900
parents bf321f1c9385
children d55f9fa978b6
files ChangeLog Makefile.am Makefile.in analyzer/cli/heapstats-cli.iml analyzer/cli/pom.xml analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/CliMain.java analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/Options.java analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/processor/CliProcessor.java analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/processor/ThreadRecordProcessor.java analyzer/core/heapstats-core.iml analyzer/core/pom.xml analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/DiffData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/LogData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/SummaryData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/ChildObjectData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/DiffData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/ObjectData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/SnapShotHeader.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/SummaryData.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/threadrecord/ThreadStat.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/jmx/JMXHelper.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/ConsumerWrapper.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/FunctionWrapper.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/PredicateWrapper.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/RunnableWrapper.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/SupplierWrapper.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/parser/SnapShotParser.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/parser/ThreadRecordParser.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/DiffCalculator.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ParseHeader.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ParseLogFile.java analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ProgressRunnable.java analyzer/fx/heapstats-analyzer.iml analyzer/fx/pom.xml analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/PluginController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/JVMLiveConfig.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/errorreporter/ErrorReportDecoder.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/jdp/JdpReceiver.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogDataConverter.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotHeaderConverter.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/threadrecorder/ThreadRecorderController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/ThreadStatConverter.java analyzer/jmx-helper/heapstats-jmx.iml analyzer/jmx-helper/pom.xml analyzer/jmx-helper/src/main/java/jp/co/ntt/oss/heapstats/jmx/JMXHelper.java mbean/java/pom.xml mbean/java/src/main/java/jp/co/ntt/oss/heapstats/mbean/HeapStatsMBean.java pom.xml specs/heapstats.spec
diffstat 50 files changed, 1147 insertions(+), 340 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Jun 26 16:53:50 2017 +0900
+++ b/ChangeLog	Mon Jun 26 21:05:32 2017 +0900
@@ -1,6 +1,10 @@
+2017-06-26 KUBOTA Yuji <kubota.yuji@lab.ntt.co.jp>
+
+	* Bug 3219: Upload artifacts to the Maven Central Repository
+
 2017-06-26 Yasumasa Suenaga <yasuenag@gmail.com>
 
-	* Bug 3405: HeapStats Agent cannot be built on CentOS 6 after Bug 3403
+	* Bug 3407: [TEST] jcmd should not be run for safepoint in ThreadExhausted tests
 
 2017-06-21 KUBOTA Yuji <kubota.yuji@lab.ntt.co.jp>
 
--- a/Makefile.am	Mon Jun 26 16:53:50 2017 +0900
+++ b/Makefile.am	Mon Jun 26 21:05:32 2017 +0900
@@ -32,6 +32,7 @@
 	$(INSTALL_DATA) $(ANALYZER_DIR)/heapstats.properties $(DESTDIR)/$(libexecdir)
 	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/heapstats-core.jar $(DESTDIR)/$(libexecdir)/lib
 	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/heapstats-mbean.jar $(DESTDIR)/$(libexecdir)/lib
+	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/heapstats-jmx-helper.jar $(DESTDIR)/$(libexecdir)/lib
 	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/jgraphx.jar $(DESTDIR)/$(libexecdir)/lib
 	$(INSTALL_DATA) $(CLI_DIR)/heapstats-cli.jar $(DESTDIR)/$(libexecdir)
 	$(INSTALL_PROGRAM) $(srcdir)/analyzer/cli/heapstats-cli $(DESTDIR)/$(bindir)
--- a/Makefile.in	Mon Jun 26 16:53:50 2017 +0900
+++ b/Makefile.in	Mon Jun 26 21:05:32 2017 +0900
@@ -534,7 +534,7 @@
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
 	$(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -560,7 +560,7 @@
 	@echo WARNING: "Support for shar distribution archives is" \
 	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -578,7 +578,7 @@
 distcheck: dist
 	case '$(DIST_ARCHIVES)' in \
 	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lz*) \
@@ -588,7 +588,7 @@
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac
@@ -807,6 +807,7 @@
 	$(INSTALL_DATA) $(ANALYZER_DIR)/heapstats.properties $(DESTDIR)/$(libexecdir)
 	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/heapstats-core.jar $(DESTDIR)/$(libexecdir)/lib
 	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/heapstats-mbean.jar $(DESTDIR)/$(libexecdir)/lib
+	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/heapstats-jmx-helper.jar $(DESTDIR)/$(libexecdir)/lib
 	$(INSTALL_DATA) $(ANALYZER_DIR)/lib/jgraphx.jar $(DESTDIR)/$(libexecdir)/lib
 	$(INSTALL_DATA) $(CLI_DIR)/heapstats-cli.jar $(DESTDIR)/$(libexecdir)
 	$(INSTALL_PROGRAM) $(srcdir)/analyzer/cli/heapstats-cli $(DESTDIR)/$(bindir)
--- a/analyzer/cli/heapstats-cli.iml	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/cli/heapstats-cli.iml	Mon Jun 26 21:05:32 2017 +0900
@@ -10,7 +10,8 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="heapstats-jmx" />
     <orderEntry type="module" module-name="heapstats-mbean" />
     <orderEntry type="module" module-name="heapstats-core" />
   </component>
-</module>
\ No newline at end of file
+</module>
--- a/analyzer/cli/pom.xml	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/cli/pom.xml	Mon Jun 26 21:05:32 2017 +0900
@@ -23,14 +23,47 @@
     <parent>
         <groupId>jp.co.ntt.oss.heapstats</groupId>
         <artifactId>heapstats</artifactId>
-        <version>2.0.trunk</version>
+        <version>2.1-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <groupId>jp.co.ntt.oss.heapstats</groupId>
     <artifactId>heapstats-cli</artifactId>
+    <version>2.1-SNAPSHOT</version>
     <packaging>jar</packaging>
+
     <name>HeapStats CLI</name>
+    <description>Command Line Interface for HeapStats Analyzer</description>
+    <url>http://icedtea.classpath.org/wiki/HeapStats</url>
+
+    <licenses>
+        <license>
+            <name>GNU General Public License, version 2</name>
+            <url>https://www.gnu.org/licenses/gpl-2.0.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <name>Yasumasa Suenaga</name>
+            <email>yasuenag@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+        <developer>
+            <name>KUBOTA Yuji</name>
+            <email>kubota.yuji@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+    </developers>
+
+    <scm>
+        <url>http://icedtea.classpath.org/hg/heapstats</url>
+        <connection>scm:hg:http://icedtea.classpath.org/hg/heapstats</connection>
+        <developerConnection>scm:hg:ssh://icedtea.classpath.org/hg/heapstats</developerConnection>
+    </scm>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -42,6 +75,24 @@
         <name>NTT OSS Center</name>
     </organization>
 
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-jmx-helper</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-mbean</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
     <build>
         <plugins>
             <plugin>
@@ -74,7 +125,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.5.5</version>
+                <version>3.0.0</version>
                 <configuration>
                     <descriptors>
                         <descriptor>src/main/assembly/distribution.xml</descriptor>
@@ -91,19 +142,78 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.3</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <executions>
+                    <execution>
+                        <id>deploy</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>deploy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>heapstats-mbean</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>heapstats-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
+    <profiles>
+        <profile>
+            <id>release-sign-artifacts</id>
+            <!-- releasing for maven repository, mvn -DperformRelease=true deploy -->
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.5</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
--- a/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/CliMain.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/CliMain.java	Mon Jun 26 21:05:32 2017 +0900
@@ -79,7 +79,7 @@
         Throwable rootCause = thrwbl;
         
         // Find root cause of exception.
-        // Exceptions is recuesive. So we need to track exception(s) through Throwable#getCause().
+        // Exceptions is recursive. So we need to track exception(s) through Throwable#getCause().
         while(rootCause.getCause() != null){
             rootCause = rootCause.getCause();
         }
--- a/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/Options.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/Options.java	Mon Jun 26 21:05:32 2017 +0900
@@ -178,9 +178,9 @@
         System.out.println("  -end  : End ID");
         System.out.println();
         System.out.println("mode:");
-        System.out.println("  -log     : Processs HeapStats resource log file.");
-        System.out.println("  -snapshot: Processs HeapStats snapshot file.");
-        System.out.println("  -event   : Processs HeapStats thread recorder file.");
+        System.out.println("  -log     : Process HeapStats resource log file.");
+        System.out.println("  -snapshot: Process HeapStats snapshot file.");
+        System.out.println("  -event   : Process HeapStats thread recorder file.");
         System.out.println("  -jmx     : Control remote HeapStats agent through JMX.");
         System.out.println();
         System.out.println("options:");
@@ -204,7 +204,7 @@
         System.out.println("      -d <p|c>: Select the direction to traverse references. p means parent, c means child.");
         System.out.println("    -e <CSV file> : Dump class histogram(s) as CSV.");
         System.out.println("    -g <CSV file> : Dump GC information as CSV.");
-        System.out.println("  -event: Processs HeapStats thread recorder file.");
+        System.out.println("  -event: Process HeapStats thread recorder file.");
         System.out.println("    -showids      : List all IDs in files.");
         System.out.println("    -threads: List all thread IDs in files.");
         System.out.println("    -id <ID>: Choose specified thread ID.");
--- a/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/processor/CliProcessor.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/processor/CliProcessor.java	Mon Jun 26 21:05:32 2017 +0900
@@ -18,7 +18,7 @@
 package jp.co.ntt.oss.heapstats.cli.processor;
 
 /**
- * Interfafce of CLI Processor.
+ * Interface of CLI Processor.
  * CLI task should implement this interface.
  * 
  * @author Yasumasa Suenaga
--- a/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/processor/ThreadRecordProcessor.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/cli/src/main/java/jp/co/ntt/oss/heapstats/cli/processor/ThreadRecordProcessor.java	Mon Jun 26 21:05:32 2017 +0900
@@ -46,8 +46,6 @@
     public ThreadRecordProcessor(Options options) {
         this.options = options;
     }
-    
-    
 
     /**
      * {@inheritDoc}
--- a/analyzer/core/heapstats-core.iml	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/heapstats-core.iml	Mon Jun 26 21:05:32 2017 +0900
@@ -9,6 +9,5 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="heapstats-mbean" />
   </component>
-</module>
\ No newline at end of file
+</module>
--- a/analyzer/core/pom.xml	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/pom.xml	Mon Jun 26 21:05:32 2017 +0900
@@ -23,14 +23,60 @@
     <parent>
         <groupId>jp.co.ntt.oss.heapstats</groupId>
         <artifactId>heapstats</artifactId>
-        <version>2.0.trunk</version>
+        <version>2.1-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <groupId>jp.co.ntt.oss.heapstats</groupId>
     <artifactId>heapstats-core</artifactId>
+    <version>2.1-SNAPSHOT</version>
     <packaging>jar</packaging>
+
     <name>HeapStats Analyzer Core</name>
+
+    <description>A core Java library for HeapStats analyzer</description>
+    <url>http://icedtea.classpath.org/wiki/HeapStats</url>
+
+    <licenses>
+        <license>
+            <name>GNU General Public License, version 2</name>
+            <url>https://www.gnu.org/licenses/gpl-2.0.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <name>Yasumasa Suenaga</name>
+            <email>yasuenag@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+        <developer>
+            <name>KUBOTA Yuji</name>
+            <email>kubota.yuji@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+    </developers>
+
+    <scm>
+        <url>http://icedtea.classpath.org/hg/heapstats</url>
+        <connection>scm:hg:http://icedtea.classpath.org/hg/heapstats</connection>
+        <developerConnection>scm:hg:ssh://icedtea.classpath.org/hg/heapstats</developerConnection>
+    </scm>
+
+    <distributionManagement>
+        <snapshotRepository>
+            <id>ossrh</id>
+            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+        </snapshotRepository>
+        <repository>
+            <id>ossrh</id>
+            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+        </repository>
+    </distributionManagement>
+
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>1.8</maven.compiler.source>
@@ -39,13 +85,6 @@
     <organization>
         <name>NTT OSS Center</name>
     </organization>
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>heapstats-mbean</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
     <build>
         <plugins>
             <plugin>
@@ -62,10 +101,90 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>2.6</version>
+            </plugin>
+            <plugin>
+                <groupId>org.sonatype.plugins</groupId>
+                <artifactId>nexus-staging-maven-plugin</artifactId>
+                <version>1.6.7</version>
+                <extensions>true</extensions>
                 <configuration>
-                    <finalName>heapstats-core</finalName>
+                    <serverId>ossrh</serverId>
+                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>
+                    <autoReleaseAfterClose>true</autoReleaseAfterClose>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.3</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <executions>
+                    <execution>
+                        <id>deploy</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>deploy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <id>release-sign-artifacts</id>
+            <!-- releasing for maven repository, mvn -DperformRelease=true deploy -->
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.5</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -87,7 +87,7 @@
      * Constructor of ArchiveData.
      * 
      * @param log LogData. This value must be included archive data.
-     * @throws java.io.IOException
+     * @throws java.io.IOException if heapstats_archive is not found
      */
     public ArchiveData(LogData log) throws IOException{
         this(log, null);
@@ -280,7 +280,12 @@
         }
         
     }
-    
+
+    /**
+     * Build zip entry.
+     *
+     * @throws IOException
+     */
     private void processZipEntry(ZipFile archive, ZipEntry entry) throws IOException{
         switch(entry.getName()){
             case "envInfo.txt":
@@ -315,7 +320,7 @@
     
     /**
      * Parsing Archive data.
-     * @throws java.io.IOException
+     * @throws java.io.IOException if could not read or/and write archive.
      */
     public void parseArchive() throws IOException{
         
@@ -336,6 +341,9 @@
         parsed = true;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     protected void finalize() throws Throwable {
         try {
@@ -387,7 +395,7 @@
      * 
      * @param file File to be got.
      * @return Contents of file.
-     * @throws IOException 
+     * @throws IOException if file not found.
      */
     public String getFileContents(String file) throws IOException{
         Path filePath = Paths.get(extractPath.getAbsolutePath(), file);
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/DiffData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/DiffData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -62,8 +62,8 @@
      * Constructor of DiffData.
      * Each fields is based on "current - prev" .
      * 
-     * @param prev
-     * @param current 
+     * @param prev Previous log data
+     * @param current Current log data
      */
     public DiffData(LogData prev, LogData current){
         dateTime = current.getDateTime();
@@ -143,7 +143,6 @@
 
     /**
      * Get %user of java process.
-     * 
      * @return %user
      */
     public double getJavaUserUsage() {
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/LogData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/LogData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -82,7 +82,7 @@
      * 
      * @param csv CSV data to be parsed.
      * @param logdir Directory to deflate if parser finds log archive.
-     * @throws IllegalArgumentException 
+     * @throws IllegalArgumentException If given csv data is not valid.
      */
     public void parseFromCSV(String csv, String logdir) throws IllegalArgumentException{
         String[] csvArray = csv.split(",");
@@ -236,7 +236,7 @@
 
     /**
      * Get soft IRQ time of system.
-     * @return soft IRQ time of system.
+     * @return Soft IRQ time of system.
      */
     public long getSystemSoftIRQTime() {
         return systemSoftIRQTime;
@@ -291,7 +291,7 @@
     }
 
     /**
-     * Get archive path when trouble occurrs.
+     * Get archive path when trouble occurs.
      * @return Archive path.
      */
     public String getArchivePath() {
@@ -299,11 +299,11 @@
     }
 
     /**
-     * This method compares with another LogData.
+     * Compares with another LogData.
      * This method is based on dateTime field.
      * 
-     * @param o
-     * @return 
+     * @param o Log data
+     * @return Compared result.
      */
     @Override
     public int compareTo(LogData o) {
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/SummaryData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/SummaryData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -22,7 +22,7 @@
 import java.util.List;
 
 /**
- * Summary data class.<br/>
+ * Summary data class.
  * This class holds process summary information.
  * It shows at process summary table.
  * @author Yasumasa Suenaga
@@ -118,7 +118,7 @@
     }
 
     /**
-     * Get average virtual memoly size (VSZ) of java process.
+     * Get average virtual memory size (VSZ) of java process.
      * @return Average of VSZ
      */
     public double getAverageVSZ() {
@@ -166,7 +166,7 @@
     }
     
     /**
-     * Statistics class for SnapSHot diff calculation.
+     * Statistics class for SnapShot diff calculation.
      */
     private class DiffSummaryStatistics{
         
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/ChildObjectData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/ChildObjectData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -46,7 +46,6 @@
 
     /**
      * Get tag of this child class.
-     * 
      * @return Tag of this child class.
      */
     public long getTag() {
@@ -63,7 +62,6 @@
 
     /**
      * Get total size of this child class.
-     * 
      * @return Total size of this child class.
      */
     public long getTotalSize() {
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/DiffData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/DiffData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -44,7 +44,7 @@
 
     /**
      * Constructor of DiffData.
-     * 
+     *
      * @param diffDate Date time of this difference data.
      * @param prev Previous data.
      * @param current Current data.
@@ -62,6 +62,17 @@
         this.ranked = isRanked;
     }
 
+    /**
+     * Constructor of DiffData.
+     *
+     * @param tag Tag number.
+     * @param diffDate Date time of this difference data.
+     * @param className Class name.
+     * @param classLoaderName Classloader name.
+     * @param instances Amount of instances.
+     * @param totalSize Total heap size of this object data.
+     * @param ranked true if this object data is ranked in.
+     */
     public DiffData(long tag, LocalDateTime diffDate, String className, String classLoaderName, Long instances, long totalSize, boolean ranked) {
         this.tag = tag;
         this.diffDate = diffDate;
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/ObjectData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/ObjectData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -31,8 +31,8 @@
 import java.util.logging.Logger;
 
 /**
- * implements {@link Serializable}, {@link Cloneable} <br>
- * <br>
+ * implements {@link Serializable}, {@link Cloneable}
+ *
  * Contains information about the classes loaded in the java virtual machine.
  */
 public class ObjectData implements Serializable, Cloneable {
@@ -254,6 +254,9 @@
         this.referenceList = referenceList;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public final String toString() {
         return (new StringJoiner(",")).add(Long.toHexString(tag))
@@ -265,6 +268,9 @@
                                       .toString();
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public final ObjectData clone() {
         
@@ -303,7 +309,7 @@
      * Equals method of this ObjectData.
      * This method is based on Tag.
      * 
-     * @param obj
+     * @param obj Object.
      * @return true if object equals.
      */
     @Override
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/SnapShotHeader.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/SnapShotHeader.java	Mon Jun 26 21:05:32 2017 +0900
@@ -298,6 +298,7 @@
     }
 
     /**
+     * Get GC cause by string.
      * @return Return the GC Cause
      */
     public final String getCauseString() {
@@ -527,7 +528,7 @@
      * FILE_FORMAT_NO_CHILD, FILE_FORMAT_HAVE_CHILD,
      * FILE_FORMAT_HAVE_CHILD_AND_METASPACE
      *
-     * @param snapShotType
+     * @param snapShotType SnapShot type.
      */
     public void setSnapShotType(byte snapShotType) {
         this.snapShotType = snapShotType;
@@ -563,7 +564,7 @@
     /**
      * Set size of SnapShot header.
      *
-     * @param snapShotHeaderSize
+     * @param snapShotHeaderSize Size of SnapShot header.
      */
     public void setSnapShotHeaderSize(long snapShotHeaderSize) {
         this.snapShotHeaderSize = snapShotHeaderSize;
@@ -630,22 +631,36 @@
     public void setSnapShot(Map<Long, ObjectData> snapShot) {
         this.snapShotCache = new SoftReference<>(snapShot);
     }
-    
+
+    /**
+     * Get true if this snapshot data has a reference data.
+     * @return true if has a reference data.
+     */
     public boolean hasReferenceData(){
         final byte extended_reftree = EXTENDED_FORMAT | EXTENDED_FORMAT_FLAG_REFTREE;
         
         return (snapShotType == FILE_FORMAT_1_1) ||
                ((snapShotType & extended_reftree) == extended_reftree);
     }
-
+    /**
+     * Get true if this snapshot data has a safepoint time.
+     * @return true if has a safepoint time.
+     */
     public boolean hasSafepointTime(){
         return (snapShotType & EXTENDED_FORMAT_FLAG_SAFEPOINT_TIME) == EXTENDED_FORMAT_FLAG_SAFEPOINT_TIME;
     }
 
+    /**
+     * Get true if this snapshot data has a metaspace data.
+     * @return true if has a metaspace data.
+     */
     public boolean hasMetaspaceData(){
         return (snapShotType != FILE_FORMAT_1_0);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public final String toString() {
         StringBuilder buf = new StringBuilder();
@@ -692,14 +707,17 @@
      * Compare function for SnapShotHeader. This method is based on
      * snapShotDate.
      *
-     * @param o
-     * @return
+     * @param o SnapHotHeader.
+     * @return Compared result.
      */
     @Override
     public int compareTo(SnapShotHeader o) {
         return snapShotDate.compareTo(o.snapShotDate);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public int hashCode() {
         return snapShotDate.hashCode();
@@ -709,8 +727,8 @@
      * equals method of this SnapShotHeader. This method is based on
      * snapShotDate.
      *
-     * @param obj
-     * @return
+     * @param obj Object
+     * @return Compared result.
      */
     @Override
     public boolean equals(Object obj) {
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/SummaryData.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/snapshot/SummaryData.java	Mon Jun 26 21:05:32 2017 +0900
@@ -25,11 +25,11 @@
 import java.util.stream.IntStream;
 
 /**
- * Summary data class.<br/>
- * This class holds process summary information. It shows at process summary
- * table.
+ * Summary data class.
+ * This class holds process summary information.
+ * It shows at process summary table.
  *
- * @author Yasu
+ * @author Yasumasa Suenaga
  */
 public class SummaryData {
 
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/threadrecord/ThreadStat.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/threadrecord/ThreadStat.java	Mon Jun 26 21:05:32 2017 +0900
@@ -106,11 +106,17 @@
         return additionalData;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public int compareTo(ThreadStat o) {
         return time.compareTo(o.time);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public String toString() {
         return String.format("%d: %s: %s (%d)", id, time.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME), event.toString(), additionalData);
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/jmx/JMXHelper.java	Mon Jun 26 16:53:50 2017 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2015 Yasumasa Suenaga
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package jp.co.ntt.oss.heapstats.jmx;
-
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.MalformedURLException;
-import java.nio.ByteBuffer;
-import java.nio.channels.AsynchronousServerSocketChannel;
-import java.nio.channels.AsynchronousSocketChannel;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import javax.management.MBeanServerConnection;
-import javax.management.MBeanServerInvocationHandler;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServiceURL;
-import jp.co.ntt.oss.heapstats.lambda.SupplierWrapper;
-import jp.co.ntt.oss.heapstats.mbean.HeapStatsMBean;
-
-/**
- * Helper class for JMX access to HeapStats agent.
- * @author Yasumasa Suenaga
- */
-public class JMXHelper implements AutoCloseable{
-    
-    public static final String DEFAULT_OBJECT_NAME = "heapstats:type=HeapStats";
-    
-    private JMXServiceURL url;
-    
-    private JMXConnector connector;
-    
-    private final HeapStatsMBean mbean;
-    
-    /**
-     * Constructor of JMXHelper.
-     * 
-     * @param url JMX URL to connect.
-     * 
-     * @throws MalformedURLException
-     * @throws IOException
-     * @throws MalformedObjectNameException 
-     */
-    public JMXHelper(String url) throws MalformedURLException, IOException, MalformedObjectNameException{
-        this(new JMXServiceURL(url));
-    }
-    
-    /**
-     * Constructor of JMXHelper.
-     * @param url JMX URL to connect.
-     * 
-     * @throws IOException
-     * @throws MalformedObjectNameException 
-     */
-    public JMXHelper(JMXServiceURL url) throws IOException, MalformedObjectNameException{
-        this.url = url;
-        connector = JMXConnectorFactory.connect(url);
-        MBeanServerConnection connection = connector.getMBeanServerConnection();
-        mbean = MBeanServerInvocationHandler.newProxyInstance(connection, new ObjectName(DEFAULT_OBJECT_NAME), HeapStatsMBean.class, false);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void close() throws IOException {
-        connector.close();
-    }
-
-    /**
-     * Get HeapStats MBean instance.
-     * 
-     * @return Instance of HeapStatsMBean.
-     */
-    public HeapStatsMBean getMbean() {
-        return mbean;
-    }
-    
-    private void receiveFile(Path path, AsynchronousSocketChannel socket){
-        try(SeekableByteChannel ch = Files.newByteChannel(path, StandardOpenOption.CREATE, StandardOpenOption.WRITE)){
-            ByteBuffer buffer = ByteBuffer.allocate(1024);
-
-            while(socket.read(buffer).get() != -1){
-                buffer.flip();
-                ch.write(buffer);
-                buffer.rewind();
-            }
-
-        } catch (IOException ex) {
-            throw new UncheckedIOException(ex);
-        } catch (InterruptedException | ExecutionException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    private void getFileInternal(Path path, boolean isSnapShot) throws IOException, InterruptedException, ExecutionException{
-        try(AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open()){
-            server.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
-            CompletableFuture<Void> receiveFuture = CompletableFuture.supplyAsync(new SupplierWrapper<>(() -> server.accept().get()))
-                                                                     .thenAccept(s -> receiveFile(path, s));
-            InetSocketAddress addr = (InetSocketAddress)server.getLocalAddress();
-
-            if(isSnapShot){
-                mbean.getSnapShot(addr.getAddress(), addr.getPort());
-            }
-            else{
-                mbean.getResourceLog(addr.getAddress(), addr.getPort());
-            }
-
-            receiveFuture.get();
-        }
-    }
-    
-    /**
-     * Get SnapShot from remote.
-     * 
-     * @param path Path to save file.
-     * 
-     * @throws IOException
-     * @throws InterruptedException
-     * @throws ExecutionException 
-     */
-    public void getSnapShot(Path path) throws IOException, InterruptedException, ExecutionException{
-        getFileInternal(path, true);
-    }
-    
-    /**
-     * Get Resource log from remote.
-     * 
-     * @param path Path to save file.
-     * 
-     * @throws IOException
-     * @throws InterruptedException
-     * @throws ExecutionException 
-     */
-    public void getResourceLog(Path path) throws IOException, InterruptedException, ExecutionException{
-        getFileInternal(path, false);
-    }
-    
-    /**
-     * Change configuration of remote HeapStats.
-     * 
-     * @param key Key name.
-     * @param value Value string.
-     */
-    public void changeConfigurationThroughString(String key, String value){
-        Object currentObj = mbean.getConfiguration(key);
-        Object newObj = value;
-        
-        if(currentObj instanceof Integer){
-            newObj = Integer.valueOf(value);
-        }
-        else if(currentObj instanceof Long){
-            newObj = Long.valueOf(value);
-        }
-        else if(currentObj instanceof Boolean){
-            newObj = Boolean.valueOf(value);
-        }
-        else if(currentObj instanceof HeapStatsMBean.LogLevel){
-            newObj = HeapStatsMBean.LogLevel.valueOf(value);
-        }
-        else if(currentObj instanceof HeapStatsMBean.RankOrder){
-            newObj = HeapStatsMBean.RankOrder.valueOf(value);
-        }
-        
-        mbean.changeConfiguration(key, newObj);
-    }
-
-    /**
-     * Get JMX URL.
-     * 
-     * @return JMX URL
-     */
-    public JMXServiceURL getUrl() {
-        return url;
-    }
-    
-}
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/ConsumerWrapper.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/ConsumerWrapper.java	Mon Jun 26 21:05:32 2017 +0900
@@ -31,6 +31,9 @@
         this.consumer = consumer;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void accept(T t) {
         try{
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/FunctionWrapper.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/FunctionWrapper.java	Mon Jun 26 21:05:32 2017 +0900
@@ -31,6 +31,9 @@
         this.function = function;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public R apply(T t) {
         try{
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/PredicateWrapper.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/PredicateWrapper.java	Mon Jun 26 21:05:32 2017 +0900
@@ -31,6 +31,9 @@
         this.predicate = predicate;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public boolean test(T t) {
         try{
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/RunnableWrapper.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/RunnableWrapper.java	Mon Jun 26 21:05:32 2017 +0900
@@ -29,6 +29,9 @@
         this.runnable = runnable;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void run() {
         try{
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/SupplierWrapper.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/lambda/SupplierWrapper.java	Mon Jun 26 21:05:32 2017 +0900
@@ -31,6 +31,9 @@
         this.supplier = supplier;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public T get() {
         try{
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/parser/SnapShotParser.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/parser/SnapShotParser.java	Mon Jun 26 21:05:32 2017 +0900
@@ -77,7 +77,7 @@
      * 
      * @param ch Channel to be read.
      * @param size Read size.
-     * @throws IOException 
+     * @throws IOException If some other I/O error occurs.
      */
     private void readLong(SeekableByteChannel ch, int size) throws IOException{
         longBuffer.position(0);
@@ -91,7 +91,7 @@
      * 
      * @param ch Channel to be read.
      * @return read value.
-     * @throws IOException 
+     * @throws IOException If some other I/O error occurs.
      */
     private int readInt(SeekableByteChannel ch) throws IOException{
         ch.read(intBuffer);
@@ -107,7 +107,7 @@
      * @param header SnapShotHeader to parse.
      * @param handler SnapShot handler.
      * @return true if parsing is succeeded.
-     * @throws IOException 
+     * @throws IOException If some other I/O error occurs.
      */
     public boolean parseSingle(SnapShotHeader header, SnapShotParserEventHandler handler) throws IOException {
 
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/parser/ThreadRecordParser.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/parser/ThreadRecordParser.java	Mon Jun 26 21:05:32 2017 +0900
@@ -57,7 +57,7 @@
      * @param ch Channel to read.
      * @param buffer ByteBuffer to use.
      * @return ByteOrder in this channel.
-     * @throws IOException 
+     * @throws IOException If some other I/O error occurs.
      */
     private ByteOrder getByteOrder(SeekableByteChannel ch, ByteBuffer buffer) throws IOException{
         buffer.position(buffer.capacity() - 1);
@@ -70,7 +70,7 @@
     
     /**
      * Get Thread ID - Thread Name map entry from channel.
-     * This method may throw UncheckedIOException if IOException occurrs.
+     * This method may throw UncheckedIOException if IOException occurs.
      * 
      * @param ch Channel to read.
      * @param buffer ByteBuffer to use.
@@ -111,7 +111,7 @@
      * @param ch Channel to read.
      * @param buffer ByteBuffer to use.
      * @return Thread ID - Thread Name map.
-     * @throws IOException
+     * @throws IOException If some other I/O error occurs.
      */
     private Map<Long, String> getThreadIdMap(SeekableByteChannel ch, ByteBuffer buffer) throws IOException{
         int capacity = buffer.capacity();
@@ -136,7 +136,7 @@
      * @param ch Channel to read.
      * @param buffer ByteBuffer to use.
      * @return Thread Stat list.
-     * @throws IOException 
+     * @throws IOException If some other I/O error occurs.
      */
     private List<ThreadStat> getThreadStatList(SeekableByteChannel ch, ByteBuffer buffer) throws IOException{
         List<ThreadStat> result = new ArrayList<>();
@@ -166,7 +166,7 @@
      * Parse HeapStats Thread Recorder file.
      * 
      * @param path Path to recorder file.
-     * @throws IOException 
+     * @throws IOException If some other I/O error occurs.
      */
     public void parse(Path path) throws IOException{
         ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024); // 1MB
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/DiffCalculator.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/DiffCalculator.java	Mon Jun 26 21:05:32 2017 +0900
@@ -94,7 +94,7 @@
     }
 
     /**
-     * Build TopN data from givien snapshot header.
+     * Build TopN data from given snapshot header.
      *
      * @param header SnapShot header to build.
      */
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ParseHeader.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ParseHeader.java	Mon Jun 26 21:05:32 2017 +0900
@@ -48,7 +48,7 @@
      * 
      * @param files List of HeapStats SnapShot files.
      * @param needJavaStyle true if class name should be converted to Java-Style
-     * @param parseAsPossible Parse SnapShot before occuring error.
+     * @param parseAsPossible Parse SnapShot before occurring error.
      */
     public ParseHeader(List<String> files, boolean needJavaStyle, boolean parseAsPossible) {
         this.files = files;
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ParseLogFile.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ParseLogFile.java	Mon Jun 26 21:05:32 2017 +0900
@@ -51,7 +51,7 @@
      * Constructor of LogFileParser.
      * 
      * @param fileList List of log to be parsed.
-     * @param parseAsPossible Parse log before occuring error.
+     * @param parseAsPossible Parse log before occurring error.
      */
     public ParseLogFile(List<File> fileList, boolean parseAsPossible){
         logEntries = new ArrayList<>();
@@ -61,7 +61,7 @@
     }
     
     /**
-     * This method addes log value from CSV.
+     * This method adds log value from CSV.
      * 
      * @param csvLine CSV data to be added. This value must be 1-raw (1-record).
      * @param logdir Log directory. This value is used to store log value.
@@ -76,9 +76,9 @@
     /**
      * Parse log file.
      * 
-     * @param logfile Log to be parsedd.
-     * @param progress
-     * @throws java.io.IOException
+     * @param logfile Log to be parsed.
+     * @param progress Amount of progressed parsing.
+     * @throws java.io.IOException If some other I/O error occurs.
      */
     protected void parse(String logfile, AtomicLong progress) throws IOException{
         Path logPath = Paths.get(logfile);
@@ -101,7 +101,6 @@
 
     /**
      * Returns diff entries of resulting on this task.
-     * 
      * @return results of this task.
      */
     public List<DiffData> getDiffEntries() {
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ProgressRunnable.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/task/ProgressRunnable.java	Mon Jun 26 21:05:32 2017 +0900
@@ -55,8 +55,8 @@
     }
     
     /**
-     * Set progress notificator.
-     * @param updateProgress Progress notificator
+     * Set progress notification.
+     * @param updateProgress Progress notification.
      */
     public void setUpdateProgress(Consumer<Long> updateProgress){
         this.updateProgress = Optional.ofNullable(updateProgress);
--- a/analyzer/fx/heapstats-analyzer.iml	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/heapstats-analyzer.iml	Mon Jun 26 21:05:32 2017 +0900
@@ -11,6 +11,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="heapstats-jmx" />
     <orderEntry type="module" module-name="heapstats-mbean" />
     <orderEntry type="module" module-name="heapstats-core" />
     <orderEntry type="module-library">
@@ -23,4 +24,4 @@
       </library>
     </orderEntry>
   </component>
-</module>
\ No newline at end of file
+</module>
--- a/analyzer/fx/pom.xml	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/pom.xml	Mon Jun 26 21:05:32 2017 +0900
@@ -23,15 +23,47 @@
     <parent>
         <artifactId>heapstats</artifactId>
         <groupId>jp.co.ntt.oss.heapstats</groupId>
-        <version>2.0.trunk</version>
+        <version>2.1-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <groupId>jp.co.ntt.oss.heapstats</groupId>
     <artifactId>heapstats-analyzer</artifactId>
+    <version>2.1-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <name>HeapStats Analyzer</name>
+    <description>HeapStats JavaFX GUI analyzer</description>
+    <url>http://icedtea.classpath.org/wiki/HeapStats</url>
+
+    <licenses>
+        <license>
+            <name>GNU General Public License, version 2</name>
+            <url>https://www.gnu.org/licenses/gpl-2.0.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <name>Yasumasa Suenaga</name>
+            <email>yasuenag@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+        <developer>
+            <name>KUBOTA Yuji</name>
+            <email>kubota.yuji@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+    </developers>
+
+    <scm>
+        <url>http://icedtea.classpath.org/hg/heapstats</url>
+        <connection>scm:hg:http://icedtea.classpath.org/hg/heapstats</connection>
+        <developerConnection>scm:hg:ssh://icedtea.classpath.org/hg/heapstats</developerConnection>
+    </scm>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -44,6 +76,31 @@
         <name>NTT OSS Center</name>
     </organization>
 
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-jmx-helper</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-mbean</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.mxgraph</groupId>
+            <artifactId>jgraphx</artifactId>
+            <version>3.3.1.1</version>
+            <scope>system</scope>
+            <systemPath>${pom.basedir}/lib/jgraphx.jar</systemPath>
+        </dependency>
+    </dependencies>
+
     <build>
         <plugins>
             <plugin>
@@ -91,18 +148,16 @@
                             <Class-Path>lib/jgraphx.jar</Class-Path>
                         </manifestEntries>
                     </archive>
-                    <finalName>heapstats-analyzer</finalName>
                 </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.5.5</version>
+                <version>3.0.0</version>
                 <configuration>
                     <descriptors>
                         <descriptor>src/main/assembly/distribution.xml</descriptor>
                     </descriptors>
-                    <finalName>heapstats-analyzer-${project.version}</finalName>
                     <attach>false</attach>
                 </configuration>
                 <executions>
@@ -115,25 +170,89 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.sonatype.plugins</groupId>
+                <artifactId>nexus-staging-maven-plugin</artifactId>
+                <version>1.6.7</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <serverId>ossrh</serverId>
+                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>
+                    <autoReleaseAfterClose>true</autoReleaseAfterClose>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.3</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <executions>
+                    <execution>
+                        <id>deploy</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>deploy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>heapstats-mbean</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>heapstats-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.mxgraph</groupId>
-            <artifactId>jgraphx</artifactId>
-            <version>3.3.1.1</version>
-            <scope>system</scope>
-            <systemPath>${pom.basedir}/lib/jgraphx.jar</systemPath>
-        </dependency>
-    </dependencies>
+    <profiles>
+        <profile>
+            <id>release-sign-artifacts</id>
+            <!-- releasing for maven repository, mvn -DperformRelease=true deploy -->
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.5</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/PluginController.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/PluginController.java	Mon Jun 26 21:05:32 2017 +0900
@@ -82,7 +82,7 @@
      * Setter of veil region.
      * This region is used for veiling (e.g. showing progress)
      * 
-     * @param veil 
+     * @param veil veiling region.
      */
     public void setVeil(Region veil){
         this.veil = veil;
@@ -92,7 +92,7 @@
      * Setter of progress indicator.
      * This region is used for veiling (e.g. showing progress)
      * 
-     * @param progress
+     * @param progress progress indicator.
      */
     public void setProgress(ProgressIndicator progress){
         this.progress = progress;
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/JVMLiveConfig.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/JVMLiveConfig.java	Mon Jun 26 21:05:32 2017 +0900
@@ -50,7 +50,7 @@
      * 
      * @param key configuration key.
      * @param defaultValue default value of configuration key.
-     * @throws HeapStatsConfigException 
+     * @throws HeapStatsConfigException when invalid HeapStats config is set.
      */
     private static void setupNumericProperty(String key, int defaultValue) throws HeapStatsConfigException{
         String valStr = prop.getProperty(key);
@@ -72,8 +72,8 @@
     /**
      * Load configuration from &lt;HeapStats home directory&gt;/jvmlive.properties .
      * 
-     * @throws IOException
-     * @throws HeapStatsConfigException 
+     * @throws IOException when properties file cannot be read.
+     * @throws HeapStatsConfigException when invalid HeapStats config is set.
      */
     public static void load() throws IOException, HeapStatsConfigException{
         Path properties = Paths.get(HeapStatsUtils.getHeapStatsHomeDirectory().toString(), "jvmlive.properties");
@@ -91,7 +91,7 @@
     }
     
     /**
-     * Wait duration for JDP packet.
+     * Get a Wait duration for JDP packet.
      * This value uses as duration for JdpValidatorService.
      * 
      * @return Wait duration for JDP packet.
@@ -101,6 +101,7 @@
     }
     
     /**
+     * Get a wait duration time for JDP packet.
      * @return Await time for threadpool shutdown.
      */
     public static int getThreadpoolShutdownAwaitTime(){
@@ -108,6 +109,7 @@
     }
     
     /**
+     * Get a prot of error report server.
      * @return Port for error report receiver.
      */
     public static int getErrorReportServerPort(){
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/errorreporter/ErrorReportDecoder.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/errorreporter/ErrorReportDecoder.java	Mon Jun 26 21:05:32 2017 +0900
@@ -101,7 +101,7 @@
      * @param crashList List of crash jvms.
      * @param ch AsynchronousSocketChannel to crash jvm.
      * 
-     * @throws IOException 
+     * @throws IOException If an I/O error occurs
      */
     public ErrorReportDecoder(ObservableList<ErrorReportDecoder> crashList, AsynchronousSocketChannel ch) throws IOException{
         crashedTime = LocalDateTime.now();
@@ -127,7 +127,7 @@
     /**
      * Parse header information in error report data.
      * 
-     * @param buf Received data 
+     * @param buf Received data
      */
     private void parseHeader(ByteBuffer buf){
         
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/jdp/JdpReceiver.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/jdp/JdpReceiver.java	Mon Jun 26 21:05:32 2017 +0900
@@ -99,7 +99,7 @@
      * @param jconsolePath Path to JConsole.
      * @param jmxPool ThreadPool which processes JMX access.
      * 
-     * @throws UnknownHostException 
+     * @throws UnknownHostException Invalid host information to access.
      */
     public JdpReceiver(ListView<JdpDecoder> jdpList, ExecutorService threadPool, Optional<String> jconsolePath, ExecutorService jmxPool) throws UnknownHostException{
         this(InetAddress.getByName(Optional.ofNullable(System.getProperty(JDP_ADDRESS_PROP_NAME)).orElse(JDP_DEFAULT_ADDRESS)),
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogDataConverter.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogDataConverter.java	Mon Jun 26 21:05:32 2017 +0900
@@ -38,8 +38,8 @@
     /**
      * This class DO NOT support this method.
      *
-     * @param string
-     * @return UnsupportedOperationException.
+     * @param string String
+     * @return UnsupportedOperationException This class cannot convert from string.
      */
     @Override
     public LogData fromString(String string) {
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotHeaderConverter.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotHeaderConverter.java	Mon Jun 26 21:05:32 2017 +0900
@@ -23,7 +23,7 @@
 import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
 
 /**
- * StringConverter for LocalDateTime of SnapShotHeader. <br/>
+ * StringConverter for LocalDateTime of SnapShotHeader.
  * This class is used at JavaFX controls.
  *
  * @author Yasumasa Suenaga
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/threadrecorder/ThreadRecorderController.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/threadrecorder/ThreadRecorderController.java	Mon Jun 26 21:05:32 2017 +0900
@@ -143,7 +143,7 @@
     
     /**
      * Event handler for open button.
-     * @param event 
+     * @param event Pushing open button event.
      */
     @FXML
     public void onOpenBtnClick(ActionEvent event){
@@ -185,7 +185,7 @@
 
     /**
      * Event handler for OK button.
-     * @param event 
+     * @param event Pushing ok button event.
      */
     @FXML
     private void onOkBtnClick(ActionEvent event){
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/ThreadStatConverter.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/ThreadStatConverter.java	Mon Jun 26 21:05:32 2017 +0900
@@ -21,9 +21,9 @@
 import jp.co.ntt.oss.heapstats.container.threadrecord.ThreadStat;
 
 /**
- * StringConverter for LocalDateTime of SnapShotHeader. <br/>
+ * StringConverter for LocalDateTime of SnapShotHeader.
  * This class is used at JavaFX controls.
- * 
+ *
  * @author Yasumasa Suenaga
  */
 public class ThreadStatConverter extends StringConverter<ThreadStat>{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/analyzer/jmx-helper/heapstats-jmx.iml	Mon Jun 26 21:05:32 2017 +0900
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="heapstats-mbean" />
+    <orderEntry type="module" module-name="heapstats-core" />
+  </component>
+</module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/analyzer/jmx-helper/pom.xml	Mon Jun 26 21:05:32 2017 +0900
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (C) 2017 Nippon Telegraph and Telephone Corporation
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>jp.co.ntt.oss.heapstats</groupId>
+        <artifactId>heapstats</artifactId>
+        <version>2.1-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+
+    <groupId>jp.co.ntt.oss.heapstats</groupId>
+    <artifactId>heapstats-jmx-helper</artifactId>
+    <version>2.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>HeapStats JMX Helper</name>
+    <description>HeapStats JMX Helper</description>
+    <url>http://icedtea.classpath.org/wiki/HeapStats</url>
+
+    <licenses>
+        <license>
+            <name>GNU General Public License, version 2</name>
+            <url>https://www.gnu.org/licenses/gpl-2.0.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <name>Yasumasa Suenaga</name>
+            <email>yasuenag@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+        <developer>
+            <name>KUBOTA Yuji</name>
+            <email>kubota.yuji@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+    </developers>
+
+    <scm>
+        <url>http://icedtea.classpath.org/hg/heapstats</url>
+        <connection>scm:hg:http://icedtea.classpath.org/hg/heapstats</connection>
+        <developerConnection>scm:hg:ssh://icedtea.classpath.org/hg/heapstats</developerConnection>
+    </scm>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+
+    <organization>
+        <name>NTT OSS Center</name>
+    </organization>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-mbean</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>heapstats-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Xlint:all</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.6</version>
+            </plugin>
+            <plugin>
+                <groupId>org.sonatype.plugins</groupId>
+                <artifactId>nexus-staging-maven-plugin</artifactId>
+                <version>1.6.7</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <serverId>ossrh</serverId>
+                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>
+                    <autoReleaseAfterClose>true</autoReleaseAfterClose>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.3</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <executions>
+                    <execution>
+                        <id>deploy</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>deploy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <profiles>
+        <profile>
+            <id>release-sign-artifacts</id>
+            <!-- releasing for maven repository, mvn -DperformRelease=true deploy -->
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.5</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/analyzer/jmx-helper/src/main/java/jp/co/ntt/oss/heapstats/jmx/JMXHelper.java	Mon Jun 26 21:05:32 2017 +0900
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 Yasumasa Suenaga
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package jp.co.ntt.oss.heapstats.jmx;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousServerSocketChannel;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.SeekableByteChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import javax.management.MBeanServerConnection;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import jp.co.ntt.oss.heapstats.lambda.SupplierWrapper;
+import jp.co.ntt.oss.heapstats.mbean.HeapStatsMBean;
+
+/**
+ * Helper class for JMX access to HeapStats agent.
+ * @author Yasumasa Suenaga
+ */
+public class JMXHelper implements AutoCloseable{
+    
+    public static final String DEFAULT_OBJECT_NAME = "heapstats:type=HeapStats";
+    
+    private JMXServiceURL url;
+    
+    private JMXConnector connector;
+    
+    private final HeapStatsMBean mbean;
+    
+    /**
+     * Constructor of JMXHelper.
+     * 
+     * @param url JMX URL to connect.
+     * 
+     * @throws MalformedURLException if <code>url</code> is malformed.
+     * @throws MalformedObjectNameException if <code>url</code> does not correspond to a valid ObjectName.
+     */
+    public JMXHelper(String url) throws IOException, MalformedObjectNameException{
+        this(new JMXServiceURL(url));
+    }
+    
+    /**
+     * Constructor of JMXHelper.
+     * @param url JMX URL to connect.
+     * 
+     * @throws IOException if could not connect to <code>url</code>.
+     * @throws MalformedObjectNameException if <code>url</code> does not correspond to a valid ObjectName.
+     */
+    public JMXHelper(JMXServiceURL url) throws IOException, MalformedObjectNameException{
+        this.url = url;
+        connector = JMXConnectorFactory.connect(url);
+        MBeanServerConnection connection = connector.getMBeanServerConnection();
+        mbean = MBeanServerInvocationHandler.newProxyInstance(connection, new ObjectName(DEFAULT_OBJECT_NAME), HeapStatsMBean.class, false);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void close() throws IOException {
+        connector.close();
+    }
+
+    /**
+     * Get HeapStats MBean instance.
+     * 
+     * @return Instance of HeapStatsMBean.
+     */
+    public HeapStatsMBean getMbean() {
+        return mbean;
+    }
+    
+    private void receiveFile(Path path, AsynchronousSocketChannel socket){
+        try(SeekableByteChannel ch = Files.newByteChannel(path, StandardOpenOption.CREATE, StandardOpenOption.WRITE)){
+            ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+            while(socket.read(buffer).get() != -1){
+                buffer.flip();
+                ch.write(buffer);
+                buffer.rewind();
+            }
+
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
+        } catch (InterruptedException | ExecutionException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    private void getFileInternal(Path path, boolean isSnapShot) throws IOException, InterruptedException, ExecutionException{
+        try(AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open()){
+            server.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
+            CompletableFuture<Void> receiveFuture = CompletableFuture.supplyAsync(new SupplierWrapper<>(() -> server.accept().get()))
+                                                                     .thenAccept(s -> receiveFile(path, s));
+            InetSocketAddress addr = (InetSocketAddress)server.getLocalAddress();
+
+            if(isSnapShot){
+                mbean.getSnapShot(addr.getAddress(), addr.getPort());
+            }
+            else{
+                mbean.getResourceLog(addr.getAddress(), addr.getPort());
+            }
+
+            receiveFuture.get();
+        }
+    }
+    
+    /**
+     * Get SnapShot from remote.
+     * 
+     * @param path Path to save file.
+     * 
+     * @throws IOException Could not read or/and write a given SnapShot file.
+     * @throws InterruptedException Something interrupt has occurred.
+     * @throws ExecutionException Could not get a given SnapShot file.
+     */
+    public void getSnapShot(Path path) throws IOException, InterruptedException, ExecutionException{
+        getFileInternal(path, true);
+    }
+    
+    /**
+     * Get Resource log from remote.
+     * 
+     * @param path Path to save file.
+     * 
+     * @throws IOException Could not read a given resource log file.
+     * @throws InterruptedException Something interrupt has occurred.
+     * @throws ExecutionException Could not get a given resource log file.
+     */
+    public void getResourceLog(Path path) throws IOException, InterruptedException, ExecutionException{
+        getFileInternal(path, false);
+    }
+    
+    /**
+     * Change configuration of remote HeapStats.
+     * 
+     * @param key Key name.
+     * @param value Value string.
+     */
+    public void changeConfigurationThroughString(String key, String value){
+        Object currentObj = mbean.getConfiguration(key);
+        Object newObj = value;
+        
+        if(currentObj instanceof Integer){
+            newObj = Integer.valueOf(value);
+        }
+        else if(currentObj instanceof Long){
+            newObj = Long.valueOf(value);
+        }
+        else if(currentObj instanceof Boolean){
+            newObj = Boolean.valueOf(value);
+        }
+        else if(currentObj instanceof HeapStatsMBean.LogLevel){
+            newObj = HeapStatsMBean.LogLevel.valueOf(value);
+        }
+        else if(currentObj instanceof HeapStatsMBean.RankOrder){
+            newObj = HeapStatsMBean.RankOrder.valueOf(value);
+        }
+        
+        mbean.changeConfiguration(key, newObj);
+    }
+
+    /**
+     * Get JMX URL.
+     * 
+     * @return JMX URL
+     */
+    public JMXServiceURL getUrl() {
+        return url;
+    }
+    
+}
--- a/mbean/java/pom.xml	Mon Jun 26 16:53:50 2017 +0900
+++ b/mbean/java/pom.xml	Mon Jun 26 21:05:32 2017 +0900
@@ -23,22 +23,59 @@
     <parent>
         <groupId>jp.co.ntt.oss.heapstats</groupId>
         <artifactId>heapstats</artifactId>
-        <version>2.0.trunk</version>
+        <version>2.1-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <groupId>jp.co.ntt.oss.heapstats</groupId>
     <artifactId>heapstats-mbean</artifactId>
+    <version>2.1-SNAPSHOT</version>
     <packaging>jar</packaging>
+
     <name>HeapStats MBean Java Module</name>
+
+    <description>A mbean module for HeapStats</description>
+    <url>http://icedtea.classpath.org/wiki/HeapStats</url>
+
+    <licenses>
+        <license>
+            <name>GNU General Public License, version 2</name>
+            <url>https://www.gnu.org/licenses/gpl-2.0.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <name>Yasumasa Suenaga</name>
+            <email>yasuenag@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+        <developer>
+            <name>KUBOTA Yuji</name>
+            <email>kubota.yuji@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+    </developers>
+
+    <scm>
+        <url>http://icedtea.classpath.org/hg/heapstats</url>
+        <connection>scm:hg:http://icedtea.classpath.org/hg/heapstats</connection>
+        <developerConnection>scm:hg:ssh://icedtea.classpath.org/hg/heapstats</developerConnection>
+    </scm>
+
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>1.6</maven.compiler.source>
         <maven.compiler.target>1.6</maven.compiler.target>
     </properties>
+
     <organization>
         <name>NTT OSS Center</name>
     </organization>
+
     <build>
         <plugins>
             <plugin>
@@ -59,6 +96,79 @@
                     <finalName>heapstats-mbean</finalName>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.3</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <executions>
+                    <execution>
+                        <id>deploy</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>deploy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <id>release-sign-artifacts</id>
+            <!-- releasing for maven repository, mvn -DperformRelease=true deploy -->
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.5</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
+
--- a/mbean/java/src/main/java/jp/co/ntt/oss/heapstats/mbean/HeapStatsMBean.java	Mon Jun 26 16:53:50 2017 +0900
+++ b/mbean/java/src/main/java/jp/co/ntt/oss/heapstats/mbean/HeapStatsMBean.java	Mon Jun 26 21:05:32 2017 +0900
@@ -122,26 +122,30 @@
   public boolean invokeAllLogCollection();
 
   /**
+   * Create a MBean service.
    * This function is for WildFly/JBoss.
-   * @throws java.lang.Exception
+   * @throws java.lang.Exception if cannot create service.
    */
   public void create() throws Exception;
 
   /**
+   * Start a MBean service.
    * This function is for WildFly/JBoss.
-   * @throws java.lang.Exception
+   * @throws java.lang.Exception if cannot start service.
    */
   public void start() throws Exception;
 
   /**
+   * Stop a MBean service.
    * This function is for WildFly/JBoss.
-   * @throws java.lang.Exception
+   * @throws java.lang.Exception if cannot stop service.
    */
   public void stop() throws Exception;
 
   /**
+   * Destory a MBean service.
    * This function is for WildFly/JBoss.
-   * @throws java.lang.Exception
+   * @throws java.lang.Exception if cannot destroy service.
    */
   public void destroy() throws Exception;
 
--- a/pom.xml	Mon Jun 26 16:53:50 2017 +0900
+++ b/pom.xml	Mon Jun 26 21:05:32 2017 +0900
@@ -22,15 +22,85 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>jp.co.ntt.oss.heapstats</groupId>
     <artifactId>heapstats</artifactId>
-    <version>2.0.trunk</version>
+    <version>2.1-SNAPSHOT</version>
     <packaging>pom</packaging>
+    <name>HeapStats</name>
+    <description>A lightweight monitoring and analysis tool for the HotSpot JVM</description>
+    <url>http://icedtea.classpath.org/wiki/HeapStats</url>
+    <licenses>
+        <license>
+            <name>GNU General Public License, version 2</name>
+            <url>https://www.gnu.org/licenses/gpl-2.0.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+    <developers>
+        <developer>
+            <name>Yasumasa Suenaga</name>
+            <email>yasuenag@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+        <developer>
+            <name>KUBOTA Yuji</name>
+            <email>kubota.yuji@gmail.com</email>
+            <organization>icedtea</organization>
+            <organizationUrl>http://www.icedtea.classpath.org</organizationUrl>
+        </developer>
+    </developers>
+    <scm>
+        <url>http://icedtea.classpath.org/hg/heapstats</url>
+        <connection>scm:hg:http://icedtea.classpath.org/hg/heapstats</connection>
+        <developerConnection>scm:hg:ssh://icedtea.classpath.org/hg/heapstats</developerConnection>
+    </scm>
+    <distributionManagement>
+        <snapshotRepository>
+            <id>ossrh</id>
+            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+        </snapshotRepository>
+        <repository>
+            <id>ossrh</id>
+            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+        </repository>
+    </distributionManagement>
     <modules>
         <module>mbean/java</module>
         <module>analyzer/core</module>
         <module>analyzer/cli</module>
         <module>analyzer/fx</module>
+        <module>analyzer/jmx-helper</module>
     </modules>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
+    <profiles>
+        <profile>
+            <id>release-sign-artifacts</id>
+            <!-- releasing for maven repository, mvn -DperformRelease=true deploy -->
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.5</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
--- a/specs/heapstats.spec	Mon Jun 26 16:53:50 2017 +0900
+++ b/specs/heapstats.spec	Mon Jun 26 21:05:32 2017 +0900
@@ -76,7 +76,7 @@
 # We do not privide FX analyzer.
 # So we install CLI analyzer manually.
 mkdir -p ${RPM_BUILD_ROOT}/%{_libexecdir}/heapstats
-cp -fR ./analyzer/cli/target/heapstats-cli-%{version}-bin/heapstats-cli-%{version}/* \
+cp -fR ./analyzer/cli/target/heapstats-cli-*-bin/heapstats-cli-*/* \
                                     ${RPM_BUILD_ROOT}%{_libexecdir}/heapstats/
 cp -f ./analyzer/cli/heapstats-cli ${RPM_BUILD_ROOT}%{_bindir}
 chmod a+x ${RPM_BUILD_ROOT}%{_bindir}/heapstats-cli
@@ -119,6 +119,7 @@
 %dir %{_libexecdir}/heapstats/lib/
 %{_libexecdir}/heapstats/lib/heapstats-core.jar
 %{_libexecdir}/heapstats/lib/heapstats-mbean.jar
+%{_libexecdir}/heapstats/lib/heapstats-jmx-helper.jar
 
 
 %changelog