【发布时间】:2014-07-17 13:11:40
【问题描述】:
Spring Boot 应用程序可以通过双击 .jar 启动,但不会打开任何终端或其他东西,所以一个 tomcat 正在端口 8080 上运行,我必须从任务管理器中将其杀死(这有点烦人运行不同的 Java 应用程序时)。 有没有办法强制spring/java打开终端或者用新窗口创建运行上下文?
我知道我可以从带有java -jar application.jar 的终端打开罐子,并且当终止终端时,服务器也被终止。但是对于客户的需求,有一个双击解决方案会很有趣。
谢谢
编辑: 现在我的主班看起来
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
编辑 #2 - 可能的解决方案:
通过评论,我得到了打开终端窗口的想法。什么是可能的,但每个系统的命令都不同。所以不同系统的测试有点复杂。
所以我的实际解决方案是打开一个java窗口并将控制台输出重定向到这个窗口。我找到了 here 并且只编辑了几行,所以 java 窗口现在看起来像这样:
import java.awt.BorderLayout;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class TextAreaOutputStreamTest extends JPanel {
private JTextArea textArea = new JTextArea(15, 30);
private TextAreaOutputStream taOutputStream = new TextAreaOutputStream(
textArea, "> ");
public TextAreaOutputStreamTest() {
setLayout(new BorderLayout());
add(new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
System.setOut(new PrintStream(taOutputStream));
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Output");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new TextAreaOutputStreamTest());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void mainRunner(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class TextAreaOutputStream extends OutputStream {
private final JTextArea textArea;
private final StringBuilder sb = new StringBuilder();
private String title;
public TextAreaOutputStream(final JTextArea textArea, String title) {
this.textArea = textArea;
this.title = title;
sb.append(title);
}
@Override
public void flush() {
}
@Override
public void close() {
}
@Override
public void write(int b) throws IOException {
if (b == '\r')
return;
if (b == '\n') {
final String text = sb.toString() + "\n";
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textArea.append(text);
}
});
sb.setLength(0);
sb.append(title);
return;
}
sb.append((char) b);
}
}
我从我的主要方法中调用它
public static void main(String[] args) throws IOException {
if (args.length == 0) {
TextAreaOutputStreamTest.mainRunner(args);
}
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
这样我也可以通过命令行参数控制行为。
欢迎使用不同的解决方案,但现在这适用于我的目的。
【问题讨论】:
-
也许可以提供一个批处理文件?缺点是你有2个文件,不过这样应该没问题吧?
-
是的,但我真的更喜欢单个文件,因为它应该是单个下载。也许我可以从 java 启动一个终端,然后在那里运行 spring 上下文!?
-
我发现this answer 在新的终端窗口中启动应用程序。但是使用该代码它只能在 Windows 上运行(我认为),所以我必须区分所有可能的系统。但几乎是解决方案