【问题标题】:Run java classes without using AppMain class in Intellij在 Intellij 中不使用 AppMain 类运行 java 类
【发布时间】:2016-07-07 23:32:14
【问题描述】:

当我从 Intellij idea 运行 java 程序时,我注意到它们是由一个名为 AppMain 的类(来自 idea_rt.jar)通过反射执行的。

IntelliJ 产品规格:

IntelliJ IDEA(社区版)IC-145.184.1 Build #IC-145.184, 建于 2016 年 3 月 1 日 JRE:1.8.0_60-b27 x86

例如:如果我执行下面的代码,

public class Example{


    public static void main(String[] args) {
        throw new RuntimeException();
}
}

以下是来自 AppMain 的 5 次内部调用的输出

线程“main”中的异常 java.lang.RuntimeException 在 Example.main(Example.java:12) 在 > sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

正如您在上面看到的那样,堆栈跟踪信息有 5 个额外的堆栈跟踪信息源自idea_rt.jar 中的 AppMain 类

是否可以在不使用 AppMain 的情况下从 IntelliJ IDE 运行 Java 应用程序?

【问题讨论】:

  • 你为什么在乎?您始终可以仅使用 JRE 作为独立运行它。但是,既然您使用的是 IDEA,为什么您会惊讶于它是启动您的应用程序的那个呢?您是要尽量减少堆栈使用量还是什么(如果是,出于什么原因)?
  • 我将堆栈跟踪存储在我的应用程序中,每次我获取堆栈跟踪时,它都会给我额外的 5 行,这很烦人..所以要么我需要手动跳过它们(这会绑定代码到只有一个 IDE,后来删除了这个代码)。所以我需要一种不使用 AppMain 在 IDEA 中运行 Java 应用程序的方法所以附带说明:当我只是使用 Debug 配置执行应用程序时,不会显示额外的信息。
  • 为什么不只检查堆栈跟踪并只保存从Example.main() 开始的帧?如果您尝试通过 IDE 解决这个“问题”,那么您对这个“问题”的处理方法就很差。
  • 我可以直接存储结果,即来自当前线程的 getStackTrace 的堆栈帧,而无需过滤 IDEA 内部不存在的额外帧。但我很好奇是否有在不使用 AppMain 的情况下运行应用程序。当我在 eclipse 中运行这个示例代码时,它只会给出没有任何 ide 特定帧的帧

标签: java intellij-idea intellij-15


【解决方案1】:

有几种方法可以实现这一点。如果您使用的是 gradle,您可以按照此处答案中的说明进行操作:gradle run,或者如果您使用的是 maven,您可以按照此处的答案进行操作:maven run。配置 maven 或 gradle 解决方案后,您可以从与您正在使用的构建工具关联的工具窗口运行它,或者您可以使用同一窗口为运行任务分配键盘快捷键。

这些解决方案很有帮助,因为它们为您构建了类路径。如果您愿意以某种方式手动构建它(也许通过在您要求 IntelliJ 为您运行该方法时从运行窗口复制它),那么您可以编写自己的 shell 脚本并要求 IntelliJ 运行它,或者通过以某种方式将其添加到您的路径并在 shell 工具窗口中输入其名称,或者通过添加引用该脚本的新“应用程序”运行配置。

但是,早期的 cmets 仍然是正确的——您不应该这样做。我假设在您考虑生产的任何情况下,您都不会从 intellij 运行应用程序?所以,这不是生产问题,它只是真正困扰您个人,在这种情况下,您应该忽略它并更好地利用您的时间。

【讨论】:

  • 我同意你的观点。只是我与IDEA IDE“紧密耦合”,远离它的想法让我害怕:)我同意我不应该浪费任何时间,所以作为一种解决方法,我只是通过调试来执行程序(关闭断点)令人惊讶的是不使用 AppMain 并且相关帧没有显示在堆栈跟踪中。或者通过另一种选择,我构建了自己的 VM 参数,不包括直接通过 java 工具执行程序的 AppMain。
  • 在避免 AppMain 作为主类方面也浪费了几个小时。它在调试模式下被避免。感谢您与我们分享。
猜你喜欢
  • 2021-04-20
  • 2020-05-12
  • 1970-01-01
  • 2014-04-02
  • 2018-09-20
  • 1970-01-01
  • 2015-10-06
  • 2012-12-24
  • 2016-02-15
相关资源
最近更新 更多