0

Hi I've got a basic Jersey Client that I'm trying to run with a main() in my "main" java class. It compiles fine in Eclipse, but when I try to run it as java application, I get:

Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.client.JerseyClientBuilder

Can anyone tell me what I'm doing wrong? Here's my 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>ca.ubc.iamwsClient</groupId>
    <artifactId>iamwsClient</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>iamwsClient</name>
    <properties>
        <jersey.version>2.5.1</jersey.version>
        <target.dir>target</target.dir>
        <project.build.directory>target</project.build.directory>
    </properties>
    <repositories>
        <repository>
            <id>JBoss Repository</id>
            <url>https://repository.jboss.org/nexus/content/groups/public</url>
        </repository>
    </repositories>
    <dependencies>
        <!-- jackson dependencies for pojo/json support -->
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-processing</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <!-- end jackson deps -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <!-- <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> 
            <version>1.8</version> </dependency> -->
        <dependency>
            <groupId>org.glassfish.jersey.connectors</groupId>
            <artifactId>jersey-apache-connector</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <!-- <dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> 
            <version>1.1</version> </dependency> -->
    </dependencies>
    <build>
        <finalName>iamwsClient</finalName>
        <outputDirectory>${basedir}/${target.dir}/classes</outputDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <!-- copy-dependency plugin -->
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-dependency-plugin</artifactId>
                                    <versionRange>[0.0,)</versionRange>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
            <!-- <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>ca.ubc.iamwsClient.IamwsClient</mainClass>
                </configuration>
            </plugin> -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>ca.ubc.iamwsClient.IamwsClient</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <!--This plugin's configuration is used to store Eclipse m2e settings 
                    only. It has no influence on the Maven build itself. -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>
                                            org.apache.maven.plugins
                                        </groupId>
                                        <artifactId>
                                            maven-dependency-plugin
                                        </artifactId>
                                        <versionRange>
                                            [2.1,)
                                        </versionRange>
                                        <goals>
                                            <goal>
                                                copy-dependencies
                                            </goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore></ignore>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

Client that I'm trying to run:

package ca.ubc.iamwsClient;

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

import org.glassfish.jersey.jackson.JacksonFeature;

import ca.ubc.iamwsClient.json.CreateEmployeeBean;
import ca.ubc.iamwsClient.json.CreateEmployeeResponseBean;


    /**
     * Main class.
     *
     */
    public class IamwsClient {

        private WebTarget getTarget(String targetUrl) throws Exception {
            // create the client
            Client c = ClientBuilder.newClient().register(JacksonFeature.class);
            return c.target(targetUrl);
        }

public CreateEmployeeResponseBean sendCreateEmployeeRequest(CreateEmployeeBean createBean, String url) {
    CreateEmployeeResponseBean rb = null;
    try {
        WebTarget target = getTarget(url);
        WebTarget wt = target.path("employeeAutoCreate");
        WebTarget generateTarget = wt.path("generate");

        rb = generateTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(createBean,MediaType.APPLICATION_FORM_URLENCODED_TYPE), 
                                    CreateEmployeeResponseBean.class);
        System.out.println("CreateEmployee:  generate response:  success=" + rb.getSuccess() + " message=" + rb.getMessage());
    } catch (Throwable t) {
        t.printStackTrace();
        System.out.println("*********EXCEPTION THROWN: " + t.getMessage());
    }   
    return rb;
}

        public static void main(String[] args) {
            String testUrl="http://localhost:9090/iamws";
            CreateEmployeeBean bean = new CreateEmployeeBean();
            // ... set some details on bean....
            IamwsClient client = new IamwsClient();
            CreateEmployeeResponseBean response = client.sendCreateEmployeeRequest(bean, testUrl);

            if (response != null) {
                System.out.println("*********server responded with flag:  " + response.getSuccess() + " message: " + response.getMessage());
            }
        }

    }
Nena
  • 681
  • 1
  • 10
  • 27
  • Please look this; http://stackoverflow.com/questions/17366266/jax-rs-2-0-change-default-implementation – Semih Eker Feb 04 '14 at 22:08
  • I did see this - however, it doesn't apply to me. My problem I think is that the dependencies are not available to the runtime configuration from within eclipse. I'm just running this as a standalone java app. How can I get eclipse to get the dependencies? I thought my pom covered it. (I'm not using restEasy) – Nena Feb 04 '14 at 22:12
  • I had such issue before when I used jersey 2.18 with jdk1.6. But what I found is that jersey 2.6 is the last version that supports jdk1.6. – macemers Jul 02 '15 at 07:14

1 Answers1

5

You need to make sure that the JAR dependency containing org.glassfish.jersey.client.JerseyClientBuilder class is available on your application's classpath during the run time. There's really no other explanation to NoClassDefFound error.

From what I can google on this class, it should be available in

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.0-m04</version>
</dependency>

In other words your com.sun.jersey dependency may be missing it.

EDIT

This is the actual answer which the OP added to the Question afterwards:

    <jersey.version>2.5.1</jersey.version>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-processing</artifactId>
        <version>${jersey.version}</version>
    </dependency>

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>

He already had org.glassfish.jersey.core and org.glassfish.jersey.connectors. He removed com.sun.jersey dependency.

I am going to try this myself shortly.

Alex R
  • 11,364
  • 15
  • 100
  • 180
maksimov
  • 5,792
  • 1
  • 30
  • 38
  • I tried your suggestion - thanks. But now i'm getting a different error (see my updated pom in original question). New error is: `java.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)` - I'm only running this as a standalone java client, so I should not need to specify java ee I don't think? – Nena Feb 04 '14 at 23:56
  • Thanks for your help @maksimov - it wasn't the exact version, but following your suggestion, I cleaned up my pom.xml and got it going (updated pom in original question for those who are interested). Standalone jersey client now sending message and receiving successfully! – Nena Feb 05 '14 at 00:46
  • What's the actual fix? This answer didn't work for me either, and now it's very high-rated in Google. – Alex R Dec 07 '15 at 22:46
  • @AlexR I understand the OP have modified the pom.xml in their question to include a correct `jersey-client` dependency – maksimov Dec 08 '15 at 09:49
  • 1
    ok I edited your answer to include the actual answer that is hidden in the edited question :-) – Alex R Dec 08 '15 at 13:53