解决maven工程测试报错java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig问题

最近采用maven构建工程,采用springboot+springshell开发 自定义命令行 工具,采用eclipse编译工程和运行均正常(mvn clean intall -Dskiptests=true运行也正常),但是使用命令 mvn clean intall中对工程进行测试的代码报如下错误:java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig,关于该错误原因及解决办法如下。

1、jersey介绍

Jersey的介绍可以参见:https://jersey.java.net
Jersey是JAX-RS(JSR311)开源参考实现用于构建RESTful Web service,它包含三个部分:
  核心服务器(Core Server) 通过提供JSR 311中标准化的注释和API标准化,可以用直观的方式开发RESTful Web服务。
  核心客户端(Core Client) Jersey客户端API能够帮助开发者与RESTful服务轻松通信;
  集成(Integration) Jersey还提供可以轻松继承Spring、Guice、Apache Abdera的库

通常的Maven配置如下:  

<!--jersey-->
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.25.1</version>
</dependency>

<!--JAXB API-->
<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>jaxws-api</artifactId>
    <version>2.0</version>
</dependency>

<!-- Json支持 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.0</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.5</version>
</dependency>

Jersey jar包说明:
  服务器 jersey-server.jar 、jersey-container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api-2.0.jar
  客户端:jersey-client.jar
  common: jersey-common.jar
 
Jersey在Project使用时有两种jar实现,一种是使用sun的jar,一种是使用glassfish的jar。Jersy version 2 之前是 com.sun.jersy,之后改名为 org.glassfish.jersey, jersey 新版本就用 org.glassfish.jersey;

2、原因
本人开发的命令行工具 采用Jersey RESTful WebService框架 访问服务器获取数据处理结果。由于只用到了Rest客户端的库,所以Maven中只引用了JAXB API,未引用jersey,虽然在主程序运行时未报错,但是在测试代码@Test方法中就报错了

3、解决办法
解决办法时在Maven中引入相关的类库,本人的完整的Maven配置如下(详细的内容,请看注释):

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>1.0.0</modelVersion>
    <artifactId>cli</artifactId>
    <name>ZHL: Client Command Line Tool</name>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.source.version>1.8</project.source.version>
        <maven.plugin.war.version>3.2.0</maven.plugin.war.version>
        <surefire.version>2.20</surefire.version>
        <testng.version>6.8.8</testng.version>
        <cxf.version>2.2.3</cxf.version>
        <spring.shell.version>2.0.0.RELEASE</spring.shell.version>
        <spring.boot.version>1.5.8.RELEASE</spring.boot.version>

        <!-- 解决错误 Exception in thread "main" java.lang.NoSuchMethodError: 
                        org.glassfish.jersey.CommonProperties.getValue(
                        Ljava/util/Map;Ljavax/ws/rs/RuntimeType;
                        Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;)
                            Ljava/lang/Object;-->
        <jersey.version>2.25.1</jersey.version>

        <start-class>com.zhl.cli.Main</start-class>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.shell</groupId>
            <artifactId>spring-shell-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-common-utilities</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-templates</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.5</version>
        </dependency>
        <dependency>
            <groupId>com.evolveum.midpoint.model</groupId>
            <artifactId>model-client</artifactId>
        </dependency>
        <!-- 解决错误:java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.25.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor -->
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!-- json依赖包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.31</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.5</version>
        </dependency>
        <!-- 引入poi,解析workbook视图 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>
        <!-- 处理excel和上面功能是一样的-->
        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6.10</version>
        </dependency>
<!--         sring test -->
<!--         <dependency>这里是spring-boot的解决办法 -->
<!--          <groupId>org.springframework.boot</groupId> -->
<!--          <artifactId>spring-boot-starter-test</artifactId> -->
<!--          <scope>test</scope> -->
<!--        </dependency> -->
        <!-- https://mvnrepository.com/artifact/junit/junit --> 
<!--        <dependency> -->
<!--            <groupId>junit</groupId> -->
<!--            <artifactId>junit</artifactId> -->
<!--            <version>4.12</version> -->
<!--        </dependency> -->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <version>${spring.boot.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                    implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer">
                                    <resource>META-INF/spring.factories</resource>
                                </transformer>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>${start-class}</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
            </plugin>
        </plugins>
    </build>
</project>

猜你喜欢

转载自blog.csdn.net/fengshuiyue/article/details/80266498