独立JAR的行为与从IDE

时间:2016-12-03 21:23:03

标签: java maven jar jersey grizzly

使用maven-assembly-plugin我可以将我的java web应用程序捆绑到一个standalone.jar

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>my.package.Main</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>standalone</finalName>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
        </plugin>

使用命令

$ mvn clean compile assembly:single

该应用程序是基于灰熊和平针织物的REST后端。 我可以使用

开始
$ java -jar standalone.jar

它似乎有效。控制台输出告诉我HTTP服务器已启动,现在正在侦听端口8765。

不幸的是,当我向任何REST端点发送请求时,我收到错误代码为500内部服务器错误的响应。 我可以从输出中得出结论,没有调用任何请求处理方法。

如果从IDE IntelliJ中启动(通过按下运行按钮),应用程序将正常工作。

类似的问题被问到Java JAR behaving differently to program run out of IDE但在我的情况下,标志-Dfile.encoding = UTF-8(也是由IDE设置)无法解决问题

编辑

正如评论中所建议的那样,我试图检查日志输出。我正在遵循Grizzly Standalone Logging

中描述的方法

当我从具有最佳日志记录级别的IDE运行应用程序时,我收到许多其他消息,包括异常

Dez 03, 2016 11:36:07 PM org.glassfish.jersey.internal.util.ReflectionHelper$2 run
FINER: Unable to load class org.osgi.framework.BundleReference using the current class loader.
java.lang.ClassNotFoundException: org.osgi.framework.BundleReference
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.glassfish.jersey.internal.util.ReflectionHelper$2.run(ReflectionHelper.java:262)
    at org.glassfish.jersey.internal.util.ReflectionHelper$2.run(ReflectionHelper.java:247)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.glassfish.jersey.internal.util.ReflectionHelper.<clinit>(ReflectionHelper.java:1471)
    at org.glassfish.jersey.server.ResourceConfig$State.<init>(ResourceConfig.java:112)
    at org.glassfish.jersey.server.ResourceConfig.<init>(ResourceConfig.java:353)
    at my.package.Main.main(Main.java:42)

当我使用-Djava.util.logging.config.file = ...

执行standalone.jar时,我没有收到任何其他日志消息

1 个答案:

答案 0 :(得分:0)

我怀疑你的罐子已经包装好了所有必需的家具。首先检查导致类org.osgi.framework.BundleReference是否实际包含在您的jar中。

如果没有,我想你的pom中缺少一些东西。在程序集插件定义中包含simple目标执行并再次运行Maven:

  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        ...
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id> <!-- this is used for inheritance merges -->
        <phase>package</phase> <!-- bind to the packaging phase -->
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

请参阅documentation