2015-11-01 12 views
10

Ich habe ein kleines Java-Programm, das mit einer MySQL-Datenbank verbindet und liest Daten von ihm. Ich bin in der Lage, es zu laufen erfolgreich java -cp verwenden, aber wenn ich versuche, es zu laufen mvn exec:java ich diese Ausnahme erhalten verwenden, nachdem das Programm beendet wird:Ausnahme beim Versuch, Java-Programm von Maven

[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) 

Warum ist das passiert und wie kann ich dieses Problem beheben? Hier ist mein Code, falls es benötigt wird:

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

Dies ist verwandt und kann helfen: http://StackOverflow.com/Questions/13471519/Running-Daemon-with-Exec-Maven-Plugin –

Antwort

12

die Sie interessieren im exec Maven Plugin

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

Dank Francisco dies funktioniert! Anstatt dies der pom.xml hinzuzufügen, habe ich sie folgendermaßen in die Befehlszeile eingefügt: mvn exec: java -Dexec.mainClass = "com.meinefirma.mydivision.App" -DexecleanDaemonThreads = false – morpheus

+0

Gern geschehen! Ich bin froh, Ihnen zu helfen: D –

1

ich eine etwas andere Lösung gefunden. Ich hatte einen ähnlichen Fehler und ich vermute, dass die Änderung der Maven-Konfiguration es beheben würde, aber ich wollte sehen, ob ich den Fehler selbst zuerst beheben konnte;). Es stellte sich heraus, dass ich nur System.exit (status) am Ende meiner Hauptmethode aufrufen musste und das Problem damit gelöst wurde. Ich nehme an, das exec-Plugin benötigt einen expliziten Aufruf von System.exit (und ähnlichem auf anderen aktiven Threads), um sich korrekt zu verhalten.

+1

Ich kann das bestätigen. Wir benutzen System.exit (0) und das Ende von main. – karlihnos

Verwandte Themen