java 带有 maven 的 Jersey 2 客户端

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27215328/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 11:25:05  来源:igfitidea点击:

Jersey 2 client with maven

javamavenjerseyjersey-2.0jersey-client

提问by jiri463

I want to create simple Jersey 2 Client app with Maven (Server app is also implemented and runs).

我想用 Maven 创建简单的 Jersey 2 客户端应用程序(服务器应用程序也已实现并运行)。

My pom.xml

我的 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.client</groupId>
    <artifactId>RestClient</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>RestClient</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.13</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

java code

代码

package com.client;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import javax.ws.rs.client.Invocation.Builder;        

public class App 
{
    public static void main( String[] args )
    {

        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://localhost:8080").path("simple-service-webapp/rest/myresource");

        Builder builder =   target.request();
        //Response response  = builder.get();
        String result  = builder.get(String.class);
        System.out.println(target.getUri().toString());
        System.out.println("Result=" + result);

    }
}

I build app by command mvn packageand everything pass. Then, I run app by java -cp target/RestClient-1.0-SNAPSHOT.jar com.client.Appand then error occurs:

我通过命令mvn package构建应用程序,一切都通过了。然后,我通过java -cp target/RestClient-1.0-SNAPSHOT.jar com.client.App运行应用程序,然后发生错误:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/ws/rs/client/ClientBuilder
        at com.client.App.main(App.java:20)
Caused by: java.lang.ClassNotFoundException: javax.ws.rs.client.ClientBuilder
        at java.net.URLClassLoader.run(URLClassLoader.java:366)
        at java.net.URLClassLoader.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 1 more

It seems that libraries are not included, because files tree of projeckt looks:

似乎不包括库,因为项目的文件树看起来:

.
├── pom.xml
├── src
│?? ├── main
│?? │?? └── java
│?? │??     └── com
│?? │??         └── client
│?? │??             └── App.java
│?? └── test
│??     └── java
│??         └── com
│??             └── client
│??                 └── AppTest.java
└── target
    ├── classes
    │?? └── com
    │??     └── client
    │??         └── App.class
    ├── generated-sources
    │?? ├── annotations
    │?? └── test-annotations
    ├── maven-archiver
    │?? └── pom.properties
    ├── RestClient-1.0-SNAPSHOT.jar
    ├── surefire
    ├── surefire-reports
    │?? ├── com.client.AppTest.txt
    │?? └── TEST-com.client.AppTest.xml
    └── test-classes
        └── com
            └── client
                └── AppTest.class

Where did I mistake? Thanks.

我哪里弄错了?谢谢。

采纳答案by Paul Samsotha

You need to copy the dependencies to from your local repo into you project (or anywhere really, wherever you want to -cp to). For this, you can use the maven-dependency-plugin. Just add this to the <plugins>

您需要将依赖项从本地存储库复制到您的项目中(或任何地方,任何您想要 -cp 到的地方)。为此,您可以使用maven-dependency-plugin。只需将此添加到<plugins>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

What the above plugin configuration will do is copy all the dependencies to target/lib.

上面的插件配置将做的是将所有依赖项复制到target/lib.

The easiest way to run the jar as an executable is to also set the Class-Pathin the MANIFEST.MF, through Maven. For that we can use the maven-jar-plugin. So add this to the <plugins>

将 jar 作为可执行文件运行的最简单方法是通过 MavenClass-PathMANIFEST.MF, 中设置。为此,我们可以使用maven-jar-plugin。所以把这个添加到<plugins>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <archive>
            <index>true</index>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.client.App</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

Also you will need to get rid of the <scope>provided</scope>for the Jersey client dependency. With this scope, Maven will not add the jars to the classpath.

您还需要摆脱对<scope>provided</scope>Jersey 客户端的依赖。在此范围内,Maven 不会将 jar 添加到类路径中。

After doing this, you can simply run java -jar your-jar.jar, without the need to -cp anything, as all the jars are specified in the Manifest. It should look something like

执行此操作后,您可以简单地运行java -jar your-jar.jar,无需 -cp 任何内容,因为所有 jars 都在 Manifest.xml 中指定。它应该看起来像

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: XxxxXxxxx
Class-Path: lib/jersey-client-2.13.jar lib/jersey-common-2.13.jar lib/
 javax.annotation-api-1.2.jar lib/jersey-guava-2.13.jar lib/osgi-resou
 rce-locator-1.0.1.jar lib/javax.ws.rs-api-2.0.1.jar lib/hk2-api-2.3.0
 -b10.jar lib/hk2-utils-2.3.0-b10.jar lib/aopalliance-repackaged-2.3.0
 -b10.jar lib/javax.inject-2.3.0-b10.jar lib/hk2-locator-2.3.0-b10.jar
  lib/javassist-3.18.1-GA.jar
Created-By: Apache Maven 3.0.5
Build-Jdk: 1.8.0_20
Main-Class: com.client.App

回答by Bohuslav Burghardt

You marked your jersey dependency as provided, therefore it won't be included in the output, because when the dependency is provided, it is assumed that it is available in the environment (for example by application server).

您将球衣依赖项标记为已提供,因此它不会包含在输出中,因为提供依赖项时,假定它在环境中可用(例如通过应用程序服务器)。

Try removing the <scope>provided</scope>from your Maven dependency or include the jersey jar on the classpath using the -cpparameter when you run your program.

尝试<scope>provided</scope>从您的 Maven 依赖项中删除 ,或者-cp在运行程序时使用参数在类路径中包含 jersey jar 。

回答by natke

The other thing you can do is package your dependencies into a fat jar. The maven-assembly-plugin will do this for you automatically.

您可以做的另一件事是将您的依赖项打包到一个胖 jar 中。maven-assembly-plugin 会自动为你做这件事。

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>YOUR MAIN CLASS HERE</mainClass>
      </manifest>
    </archive>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

You can create a custom assembly specification if you need anything more sophisticated that this basic mode in which all dependencies are included in the jar.

如果您需要比所有依赖项都包含在 jar 中的基本模式更复杂的任何内容,您可以创建自定义程序集规范。

There is also the maven-shade-plugin, which is also more configurable.

还有 maven-shade-plugin,它也更易于配置。

Another useful tool is:

另一个有用的工具是:

mvn dependency:tree -Dverbose

to see exactly what your dependencies are.

以确切了解您的依赖项。