使用launch4j生成的可执行文件中的Grizzly / Jersey资源

时间:2014-02-27 22:16:10

标签: java grizzly launch4j jersey-1.0

当从launch4j生成的可执行文件运行Web服务器时,我在使用Jersey Resources运行Grizzly Web服务器时遇到问题。资源位于launch4j生成的可执行文件中,但程序无法访问它们。如果我直接从jar执行它,它运行没有问题。但我需要提供一个.exe来运行网络服务器。

网络服务器代码:

String uri = buildURI();
HashMap<String,String> initParams = new HashMap<String,String>();
initParams.put(PackagesResourceConfig.PROPERTY_PACKAGES, "my.packages.resources");
initParams.put(WebAppResourceConfig.FEATURE_XMLROOTELEMENT_PROCESSING, "true");
initParams.put(FeaturesAndProperties.FEATURE_FORMATTED, "true");
HttpServer httpServer = GrizzlyWebContainerFactory.create(uri, initParams);
httpServer.start();

我在my.packages.resources中有一个名为InfoRestResource的类,代码如下:

@Path("/info")
public class InfoRestResource {
    @GET
    @Path("/time")
    @Produces(MediaType.TEXT_PLAIN)
    public String getTime() {
        return String.valueOf(new Date().getTime());
    }
}

launchj4 Maven配置:

<plugin>
    <groupId>org.bluestemsoftware.open.maven.plugin</groupId>
    <artifactId>launch4j-plugin</artifactId>
    <version>1.5.0.0</version>
    <executions>
        <execution>
            <id>launch4j</id>
            <phase>package</phase>
            <goals>
                <goal>launch4j</goal>
            </goals>
            <configuration>
                <dontWrapJar>false</dontWrapJar>
                <headerType>console</headerType>
                <jar>${basedir}/target/my-jar-with-dependencies.jar</jar>
                <outfile>${basedir}/target/program.exe</outfile>
                <errTitle></errTitle>
                <cmdLine></cmdLine>
                <chdir></chdir>
                <priority>normal</priority>
                <downloadUrl>http://java.com/download</downloadUrl>
                <supportUrl></supportUrl>
                <customProcName>true</customProcName>
                <stayAlive>false</stayAlive>
                <manifest></manifest>
                <singleInstance>
                    <mutexName>MyLaunch4jMutex</mutexName>
                    <windowTitle></windowTitle>
                </singleInstance>
                <jre>
                    <path></path>
                    <minVersion>1.6.0</minVersion>
                    <maxVersion></maxVersion>
                    <initialHeapSize>64</initialHeapSize>
                    <maxHeapSize>512</maxHeapSize>
                </jre>
            </configuration>
        </execution>
    </executions>
</plugin>

输出

当我运行.exe:

WebServer started at http://localhost:9200/program/
Scanning for root resource and provider classes in the packages:
    my.packages.resources
Initiating Jersey application, version 'Jersey: 1.6 03/25/2011 01:14 PM'
The ResourceConfig instance does not contain any root resource classes.
service exception:
com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
    at com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:103)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1178)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.access$600(WebApplicationImpl.java:159)
    at com.sun.jersey.server.impl.application.WebApplicationImpl$12.f(WebApplicationImpl.java:693)
    at com.sun.jersey.server.impl.application.WebApplicationImpl$12.f(WebApplicationImpl.java:690)
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:690)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:685)
    at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:488)
    at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:318)
    at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:601)

另一方面,当我从Jar运行它时,它工作正常,我得到以下输出:

WebServer started at http://localhost:9200/program/
Scanning for root resource and provider classes in the packages:
    my.packages.resources
Root resource classes found:
    class my.packages.resources.InfoRestResource 

我真的很感激解决这个问题的任何帮助!谢谢!

1 个答案:

答案 0 :(得分:0)

我们首先有两个模块 - rest-api,其中jersey应该找到的所有类都是,restmod是exe设置以及其他类(带有Jetty引导程序的主类等)

对于所有模块,我们的Launch4j处理都是unified in parent POM,它将JAR包含在EXE中。在我们将rest-apirestmod合并之后(因为它对我们来说没有任何意义让它们分开)我们遇到了同样的问题。 Devel / java工作正常,但EXE版本为任何端点返回404。我调试了一段时间,并意识到它似乎是泽西岛EXE包装的问题。找到你的问题,没有答案。

我们最终做了什么:我们介绍了restmod-exe模块。这次它不包含任何类,它只是将图标(两个资源)包装到JAR中,并像以前一样包含在EXE中(因此不会改变我们父POM的首选设置)。我们管理依赖项的方式也没有变化(我们将dependency_libsmaven-dependency-plugin放在一起)。唯一的区别是主要类现在位于restmod.jar目录中的depenency_libs - 但这没有问题。

所以我们回到了两个模块,但第二个模块的责任是EXE包装,没有别的。适合我们。

BTW:链接的博客文章还讨论了如何从EXE部署WAR结构的问题,这是我们之前的情况(使用Jetty)。现在它不是 - 但它只是证明了泽西并不是唯一不愿意在类路径中处理EXE / ZIP的人。