从Web应用程序调用标准应用程序

时间:2015-12-13 22:27:20

标签: java rest java-ee jersey

我在Eclipse上有两个应用程序(两个项目):

应用程序1:这是普通的Java标准应用程序,它将public static void main方法作为应用程序的入口点。 (JAR)

应用程序2:这是使用Jersey的Rest Web服务。

我想在特定网址上调用应用程序2中的应用程序1。我怎样才能做到这一点 ?要部署应用程序2,我可以对tomcat文件夹进行战争,但是我应该如何处理应用程序1 jar(这应该是可以执行的吗?)

我想在Web容器/服务器上部署这两个应用程序,以便客户端可以通过应用程序2调用application1,服务器上的人也可以将应用程序1作为普通应用程序调用。

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资源类中。