title: Exception while trying to run java program from maven
body: <p>I have a small java program that connects to a mysql db and reads data from it. I am able to run it successfully using <code>java -cp</code> but when I try to run it using <code>mvn exec:java</code> I get this exception after the program has finished:</p>
  
  <pre><code>[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)
  </code></pre>
  
  <p>Why is this happening and how can I fix this? Here is my code in case it is needed:</p>
  
  <pre><code>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;
          }
      }
  }
  </code></pre>