如何在Eclipse中的Maven项目中编译和运行Java应用程序?

时间:2016-06-28 18:35:40

标签: java eclipse maven

我有一个现有的Web应用程序A,它是Eclipse中的Maven项目。它在Tomcat 8 localhost服务器上运行。现在我有一个Java应用程序B,它本身就是一个单独的项目。我已将A导入我的工作区,其中A作为另一个项目。我正在尝试运行一个主类(称为App.java),它存在于B中的一个类中.A中的类如下:

public void runOrgReportUtility() throws IOException {
    int k = runProcess("javac /Users/ag/utilities/org-report-utility/src/main/java/com/vs/orgreport/App.java", null);
    if (k==0) {
        log.info("Compiled. Now trying to run class.");
        String commandStr = "java -cp /Users/ag/utilities/org-report-utility/src/main/java/com/vs/orgreport/ App";
        log.info("Command String: ");
        log.info(commandStr);
        runProcess(commandStr);
}

public int runProcess(String command, String[]) throws Exception {
    Process pro = Runtime.getRuntime().exec(command);
    pro.waitFor();
    return pro.exitValue();
  }

当我尝试运行A时,控制台给了我一堆error: cannot find symbol,用于B中的各种类。这让我意识到只有App.java被编译和运行,而不是其他B中的依赖类。

当我启动原始Web应用程序时,如何编译和运行第二个java应用程序?

我尝试过的事情:

  • 设置(原始)项目引用以包含辅助Java应用程序
  • 将Java应用程序项目添加到原始项目的Java构建路径(在项目选项卡中)
  • 将Java应用程序添加到原始项目的部署程序集

1 个答案:

答案 0 :(得分:2)

如果要调用它,请不要编译应用程序。这很糟糕:

  1. 由于所有依赖项,使用javac进行编译很难。正如您所发现的,在单个java文件上调用javac并不是一件简单的事。
  2. 为什么要等到你试图运行它以发现你有一个错误让它不能编译?
  3. 为什么每次运行它都会产生编译的开销?
  4. 你通常会使用maven来编译B并且可能使用maven-shade-plugin创建一个包含B和所有依赖项的B.jar(又名" fat" jar)。然后当A调用B时,您可以在调用它包含的应用程序时使用胖jar作为类路径。

    您可能会考虑的其他事项:

    1. 您可能还可以在Web应用程序中包含fat jar,这样您就不必依赖于必须安装的外部jar才能使Web应用程序完全正常运行。
    2. 不是在单独的进程中执行其他应用程序,而是直接调用App.main()在同一个JVM中运行它。您可能希望它在单独的线程中运行,这很容易做到。
    3. 如果您确实需要单独的操作系统流程,请使用ProcessBuilder而不是Runtime.exec。在许多情况下,它是一个更容易使用和正确使用的API。