【问题标题】:Spring boot jar double-clickspring boot jar 双击
【发布时间】: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 上运行(我认为),所以我必须区分所有可能的系统。但几乎是解决方案

标签: java spring


【解决方案1】:

您可以编写一个简单的 .bat 文件。 只需将 cmd 语句写入文件并保存为“random”.bat

【讨论】:

  • 但它只能在 Windows 上运行,我必须在构建后下载 2 个文件。
猜你喜欢
  • 1970-01-01
  • 2013-05-18
  • 2015-01-14
  • 1970-01-01
  • 2019-04-12
  • 2013-07-10
  • 2021-08-01
  • 2016-02-14
  • 2018-07-21
相关资源
最近更新 更多