当从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());
}
}
<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
我真的很感激解决这个问题的任何帮助!谢谢!
答案 0 :(得分:0)
我们首先有两个模块 - rest-api
,其中jersey应该找到的所有类都是,restmod
是exe设置以及其他类(带有Jetty引导程序的主类等)
对于所有模块,我们的Launch4j处理都是unified in parent POM,它将JAR包含在EXE中。在我们将rest-api
与restmod
合并之后(因为它对我们来说没有任何意义让它们分开)我们遇到了同样的问题。 Devel / java工作正常,但EXE版本为任何端点返回404。我调试了一段时间,并意识到它似乎是泽西岛EXE包装的问题。找到你的问题,没有答案。
我们最终做了什么:我们介绍了restmod-exe
模块。这次它不包含任何类,它只是将图标(两个资源)包装到JAR中,并像以前一样包含在EXE中(因此不会改变我们父POM的首选设置)。我们管理依赖项的方式也没有变化(我们将dependency_libs
与maven-dependency-plugin
放在一起)。唯一的区别是主要类现在位于restmod.jar
目录中的depenency_libs
- 但这没有问题。
所以我们回到了两个模块,但第二个模块的责任是EXE包装,没有别的。适合我们。
BTW:链接的博客文章还讨论了如何从EXE部署WAR结构的问题,这是我们之前的情况(使用Jetty)。现在它不是 - 但它只是证明了泽西并不是唯一不愿意在类路径中处理EXE / ZIP的人。