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 java -cp
but when I try to run it using mvn exec:java
I get this exception after the program has finished:
[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)
Why is this happening and how can I fix this? Here is my code in case it is needed:
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("%st%sn", 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; } } }
Advertisement
Answer
Try this in the exec maven plugin
<configuration> <mainClass>com.test.Startup</mainClass> <cleanupDaemonThreads>false</cleanupDaemonThreads> </configuration>