2016-06-28 320 views
1

我有一个现有的Web应用程序A,它是Eclipse中的Maven项目。它在Tomcat 8本地主机服务器上运行。现在我有一个Java应用程序B,它是一个独立的项目。我已经将A作为另一个项目导入到我的工作空间中。我试图运行其中B中存在从A类中的主类(称为App.java)A内的类是下面:如何在Eclipse的Maven项目中编译和运行Java应用程序?

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(); 
    } 

当我试图运行的,控制台给了我一堆error: cannot find symbol为B.此范围内的各种类让我意识到,只有App.java正在编译和运行,而不是其他相关的类中B.

如何将我的第二个Java应用程序进行编译和运行的时候,我开始了我的原Web应用程序?

事情我已经尝试:

  • 集(原件)项目引用,包括二级Java应用程序
  • 的Java应用程序项目添加到Java构建路径(项目标签)原项目
  • 的将Java应用程序添加到原始项目的部署程序集

回答

2

当您要调用它时,不要编译该应用程序。这很糟糕:

  1. 由于所有依赖关系,使用javac编译很困难。正如您发现的那样,在单个java文件上调用javac并不是一件简单的事情。
  2. 为什么要等到你试图运行它才能发现你的编译错误?
  3. 为什么每次运行时都会编译它的开销?

您通常会使用maven编译B,并可能使用maven-shade-plugin来创建一个包含B和所有依赖关系(又名“胖”jar)的B.jar。然后,当A调用B时,可以在调用其包含的应用程序时使用胖jar作为类路径。

其他的事情你可能会考虑:

  1. 你也许还包括在你的web应用程序中的肥罐子,让你不依赖于具有外部罐子必须到位,以便为您的Web应用程序充分发挥功能。
  2. 而不是在单独的进程中执行另一个应用程序,只需直接调用App.main()即可在同一个JVM中运行它。您可能希望它在单独的线程中运行,这很容易实现。
  3. 如果您确实需要单独的OS进程,请使用ProcessBuilder而不是Runtime.exec。在很多情况下,这是一个更简单的使用和获取正确的API。
+0

谢谢!我跟着你的建议去编译成一个jar文件。然后我将jar文件作为库添加到java构建路径中,并能够使用App.main()运行它。 –

相关问题