2015-11-01 13 views
10

私はmysqlデータベースに接続し、そこからデータを読み出す小さなJavaプログラムを持っています。私はjava -cpを使用して正常に実行することですが、私はmvn exec:javaを使用して、それを実行しようとすると、プログラムが終了した後、私はこの例外を取得:mavenからjavaプログラムを実行しようとしているときに例外が発生しました

[WARNING] thread Thread[MySQL Statement Cancellation Timer,5,com.mycompany.mydivision.App] was interrupted but is still alive after waiting at least 15000msecs 
[WARNING] thread Thread[MySQL Statement Cancellation Timer,5,com.mycompany.mydivision.App] will linger despite being asked to die via interruption 
[WARNING] NOTE: 1 thread(s) did not finish despite being asked to via interruption. This is not a problem with exec:java, it is a problem with the running code. Although not serious, it should be remedied. 
[WARNING] Couldn't destroy threadgroup org.codehaus.mojo.exec.ExecJavaMojo$IsolatedThreadGroup[name=com.mycompany.mydivision.App,maxpri=10] 
java.lang.IllegalThreadStateException 
    at java.lang.ThreadGroup.destroy(ThreadGroup.java:775) 
    at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:328) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) 
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:197) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 

は、なぜこの出来事であると私はこれをどのように修正することができますか?ここに私のコードは、それが必要とされる場合には次のとおりです。

public class App 
{ 

    public static void main(String[] args) 
    { 
     try (JdbcReader reader = new JdbcReader()) 
     { 
      reader.test(); 
     } 
     catch (SQLException ex) { 
      // handle any errors 
      System.out.println("SQLException: " + ex.getMessage()); 
      System.out.println("SQLState: " + ex.getSQLState()); 
      System.out.println("VendorError: " + ex.getErrorCode()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
package com.mycompany.mydivision; 

import com.vividsolutions.jts.geom.Geometry; 

import java.io.Closeable; 
import java.io.InputStream; 
import java.sql.*; 

/** 
* 
*/ 
public class JdbcReader implements Closeable{ 

    Connection conn; 

    public JdbcReader() throws ClassNotFoundException, SQLException, IllegalAccessException, InstantiationException 
    { 
     // The newInstance() call is a work around for some 
     // broken Java implementations 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     this.conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb?user=guest"); 
    } 

    /** 
    * https://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-statements.html 
    */ 
    public void test() throws Exception 
    { 
     Statement stmt = null; 
     ResultSet rs = null; 
     try { 
      stmt = this.conn.createStatement(); 
      if (stmt.execute("SELECT * FROM mydb.my_table limit 20")) { 
       rs = stmt.getResultSet(); 
       // Fetch each row from the result set 
       while (rs.next()) { 
        String name = rs.getString("name"); 
        String description = rs.getString("Descr"); 

        System.out.printf("%s\t%s\n", name, description); 
       } 
      } 
     } 
     finally { 
      // it is a good idea to release 
      // resources in a finally{} block 
      // in reverse-order of their creation 
      // if they are no-longer needed 

      if (rs != null) { 
       try { 
        System.out.println("closing ResultSet"); 
        rs.close(); 
       } catch (SQLException sqlEx) { } // ignore 

       rs = null; 
      } 

      if (stmt != null) { 
       try { 
        System.out.println("closing Statement"); 
        stmt.close(); 
       } catch (SQLException sqlEx) { } // ignore 

       stmt = null; 
      } 
     } 
    } 

    public void close() 
    { 
     if (conn != null) 
     { 
      try { 
       System.out.println("closing connection"); 
       conn.close(); 
      } 
      catch (SQLException ex) { } // ignore 
      conn = null; 
     } 
    } 
} 
+0

これが関係していると役立つことがあります。http://stackoverflow.com/questions/13471519/running-daemon-with-exec-maven-plugin –

答えて

12

execのMavenプラグイン

<configuration> 
     <mainClass>com.test.Startup</mainClass> 
     <cleanupDaemonThreads>false</cleanupDaemonThreads> 
</configuration> 
+2

おかげフランシスコこれは動作しません!これをpom.xmlに追加するのではなく、次のようにコマンドラインに追加しました。mvn exec:java -Dexec.mainClass = "com.mycompany.mydivision.App" -Dexec.cleanupDaemonThreads = false – morpheus

+0

ようこそ!あなたを助けてくれてうれしいです:D –

1

に、私は少し異なる解決策を見つけ、これを試してみてください。私も同様のエラーがありました.Mavenの設定を変更するとそれを修正すると思いますが、まずエラーを修正できるかどうか確認したいと思いました。私が必要としたのは、私のメインメソッドの終わりにSystem.exit(ステータス)を呼び出すことでしたが、それが問題を解決しました。私はexecプラグインがSystem.exit(そして他のアクティブなスレッドでも同様)への明示的な呼び出しを必要としていると思う。

+1

これを確認できます。 System.exit(0)とmainの終わりを使用します。 – karlihnos