我在Eclipse上有两个应用程序(两个项目):
应用程序1:这是普通的Java标准应用程序,它将public static void main方法作为应用程序的入口点。 (JAR)
应用程序2:这是使用Jersey的Rest Web服务。
我想在特定网址上调用应用程序2中的应用程序1。我怎样才能做到这一点 ?要部署应用程序2,我可以对tomcat文件夹进行战争,但是我应该如何处理应用程序1 jar(这应该是可以执行的吗?)
我想在Web容器/服务器上部署这两个应用程序,以便客户端可以通过应用程序2调用application1,服务器上的人也可以将应用程序1作为普通应用程序调用。
答案 0 :(得分:2)
这是一个概念上的错误。
main()
方法基本上只适用于命令行界面。它需要CLI参数,如果需要,验证并准备它们适当的参数,然后最终做"通常" Java创建和调用一些bootstrap类的东西。一个好的main()
方法基本上归结为:
public class MainClass {
public static void main(String... args) {
// Prepare arguments.
String foo = args[0];
Integer bar = Integer.valueOf(args[1]);
// Do the real work.
SomeClass someClass = new SomeClass();
SomeResult someResult = someClass.fuzz(foo, bar);
// Present result and exit.
System.out.println(someResult);
System.exit(0);
}
}
从Web应用程序调用这样的方法是没有意义的。更重要的是,当这样的main()
方法明确调用System#exit()
时,可能会有危险。它可以关闭整个服务器! (虽然更好的服务器内置了限制,以防止这样的代码。)
您应该只添加Web界面而不是使用命令行界面。只需烘焙Java应用程序项目的普通JAR,并将其放在webapp的/WEB-INF/lib
文件夹中(或通过Deployment Assembly,以防您使用Eclipse并在工作区中同时拥有这两个项目)。它不需要是可执行的(即使它是,无论如何,webapp会忽略这个事实)。鉴于您使用JAX-RS作为Web界面,这里的正确替换方式如下:
@Path("main")
public class MainResource {
@GET
@Path("fuzz/{foo}/{bar}")
@Produces(MediaType.TEXT_PLAIN)
public String fuzz(@PathParam("foo") String foo, @PathParam("bar") Integer bar) {
// Do the real work.
SomeClass someClass = new SomeClass();
SomeResult someResult = someClass.fuzz(foo, bar);
// Return result.
return someResult.toString();
}
}
无需通过webapp中的CLI / main()
执行/处理/调用ProcessBuilder
方法。如果Java已经存在并且可以简单地放在运行时类路径中那就没有意义。
但是,如果您在main()
方法中拥有整个逻辑,那么您就会遇到面向对象的设计问题。是时候将可重用代码重构为上面的SomeClass
,以便可以在其他地方重用,例如在JAX-RS资源类中。