在控制台输出中创建指向项目文件的超链接

Create a hyperlink to a project file in console output

有没有办法让我在控制台输出中写出一个 link,当点击它时,它会指向 Intellij 中的一个项目文件?

例如,当发生 运行 次异常时会发生这种情况。我看到了堆栈跟踪,我可以在控制台中单击 link,将我引导至问题所在。在这里,我可以单击 DatabaseConfiguration.java,我将被重定向到 Intellij 中的那个文件。

我想做的是输出一个 link 到一个 readme.txt 文件,当 main 启动时这个文件被写入控制台。单击它会在 Intellij 中打开 readme.txt。

我也在使用 log4j 并将输出定向到控制台,这可能会影响解决方案。这是我的转换模式:

log4j.appender.FILE.layout.conversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] %m%n

IDEA 将在控制台中为任何匹配以下模式的文本创建一个 link:

(${FileName}.${FileExtention}:${lineNum})

或作为正则表达式:

\([\w \.\-]+\.[\w]*:[\d]+\)

例如: (ErrorNotes.txt:10)

请注意,您需要包含括号。对于实际的 class,您可以在 log4j 模式中使用以下内容: (%F:%L) 例如: 要引用另一个 class 或文件,您必须自己在括号内输出实际文件名、扩展名和行号,因为 log4j 只能访问当前 class 的信息。例如:

logger.error("A FluxCapacitorExcpetion #88 has occurred. See (Error Details.txt:542) for more details.")

我找到了适合我的解决方案:

System.out.println("Printing stack trace:");
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for (int i = 1; i < elements.length; i++) {
  StackTraceElement s = elements[i];
  System.out.println("\tat " + s.getClassName() + "." + s.getMethodName()
      + "(" + s.getFileName() + ":" + s.getLineNumber() + ")");
}

主要结果在这里(只有 link 行代码 - 没有完整的堆栈跟踪):

StackTraceElement[] elements = Thread.currentThread().getStackTrace();
StackTraceElement s = elements[elements.length-1];
System.out.println("\tat " + s.getClassName() + "." + s.getMethodName()
                + "(" + s.getFileName() + ":" + s.getLineNumber() + ")");