尝试从maven运行java程序时出现异常

Exception while trying to run java program from maven

我有一个小型 java 程序,它连接到 mysql 数据库并从中读取数据。我可以使用 java -cp 成功运行它,但是当我尝试使用 mvn exec: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\

", 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;

    }

  }

}

<configuration>

   <mainClass>com.test.Startup</mainClass>

   <cleanupDaemonThreads>false</cleanupDaemonThreads>

</configuration>

为什么会发生这种情况,我该如何解决?这是我的代码以备不时之需:

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

", 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;

    }

  }

}

<configuration>

   <mainClass>com.test.Startup</mainClass>

   <cleanupDaemonThreads>false</cleanupDaemonThreads>

</configuration>

在 exec 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)

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;

    }

  }

}

<configuration>

   <mainClass>com.test.Startup</mainClass>

   <cleanupDaemonThreads>false</cleanupDaemonThreads>

</configuration>

我找到了一个稍微不同的解决方案。我有一个类似的错误,我猜更改 Maven 配置会修复它,但我想看看我是否可以先修复错误本身;)。事实证明,我所需要的只是在我的主要方法结束时调用 System.exit(status) 并解决了问题。我猜 exec 插件需要显式调用 System.exit(在其他活动线程上类似)才能正常运行。


在程序的最后一行显式使用 System.exit(0); 来解决这个问题。


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161