Exception while trying to run java program from maven
我有一个小型 java 程序,它连接到 mysql 数据库并从中读取数据。我可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | [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) |
为什么会发生这种情况,我该如何解决?这是我的代码以备不时之需:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 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\ ", 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; } } } |
在 exec maven 插件中试试这个
1 2 3 4 | <configuration> <mainClass>com.test.Startup</mainClass> <cleanupDaemonThreads>false</cleanupDaemonThreads> </configuration> |
我找到了一个稍微不同的解决方案。我有一个类似的错误,我猜更改 Maven 配置会修复它,但我想看看我是否可以先修复错误本身;)。事实证明,我所需要的只是在我的主要方法结束时调用 System.exit(status) 并解决了问题。我猜 exec 插件需要显式调用 System.exit(在其他活动线程上类似)才能正常运行。
在程序的最后一行显式使用