我有一个现有的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应用程序?
我尝试过的事情:
答案 0 :(得分:2)
如果要调用它,请不要编译应用程序。这很糟糕:
javac
并不是一件简单的事。你通常会使用maven来编译B并且可能使用maven-shade-plugin创建一个包含B和所有依赖项的B.jar(又名" fat" jar)。然后当A调用B时,您可以在调用它包含的应用程序时使用胖jar作为类路径。
您可能会考虑的其他事项:
App.main()
在同一个JVM中运行它。您可能希望它在单独的线程中运行,这很容易做到。ProcessBuilder
而不是Runtime.exec
。在许多情况下,它是一个更容易使用和正确使用的API。