ClassNotFoundException при запуске клиента веб-службы, созданного с использованием цели wsimport maven в eclipse

Я разрабатываю клиент веб-службы в eclipse. Я сгенерировал артефакты для веб-службы, используя цель wsimport maven (см. pom.xml ниже), а затем написал простой клиент, подобный этому, в основном методе:

TeamsService service = new TeamsService();
Teams port = service.getTeamsPort();
List<Team> teams = port.getTeams();
for (Team team : teams) {
    System.out.println("Team name: " + team.getName() + " (roster count: " + team.getRosterCount() + ")");
    for (Player player : team.getPlayers())
                System.out.println(" Player: " + player.getNickname());
}

К сожалению, когда я запускаю проект в eclipse как Java-приложение, я получаю исключение ClassNotFoundException. Я попытался запустить клиент, используя цель exec: java, и он работал нормально, поэтому я предполагаю, что проблема может заключаться в конфигурации eclipse (например, плагин m2e или путь к классам).

Буду очень признателен за любую помощь.

P.S. Я новичок, поэтому, возможно, мне не хватает чего-то основного.

пом.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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.foo</groupId>
    <artifactId>JWSClients</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.8</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jax-ws-commons</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>
                    <wsdlUrls>
                        <wsdlUrl>http://localhost:8888/teams?wsdl</wsdlUrl>
                    </wsdlUrls>
                    <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </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.jvnet.jax-ws-commons
                                        </groupId>
                                        <artifactId>
                                            jaxws-maven-plugin
                                        </artifactId>
                                        <versionRange>
                                            [2.3,)
                                        </versionRange>
                                        <goals>
                                            <goal>wsimport</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore></ignore>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <properties>
        <encoding>UTF-8</encoding>
    </properties>
</project>

Трассировки стека:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/istack/localization/Localizable
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.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:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.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:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:208)
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:112)
    at javax.xml.ws.Service.<init>(Service.java:77)
    at ch01.team.TeamsService.<init>(TeamsService.java:42)
    at ch01.team.Client.main(Client.java:7)
Caused by: java.lang.ClassNotFoundException: com.sun.istack.localization.Localizable
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.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:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 29 more

Журнал Maven при выполнении exec: java

[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building JWSClients 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[WARNING] The POM for org.eclipse.m2e:lifecycle-mapping:jar:1.0.0 is missing, no dependency information available
[WARNING] Failed to retrieve plugin descriptor for org.eclipse.m2e:lifecycle-mapping:1.0.0: Plugin org.eclipse.m2e:lifecycle-mapping:1.0.0 or one of its dependencies could not be resolved: Failure to find org.eclipse.m2e:lifecycle-mapping:jar:1.0.0 in http://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
[INFO] 
[INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ JWSClients >>>
[INFO] 
[INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ JWSClients <<<
[INFO] 
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ JWSClients ---
Team name: Abbott and Costello (roster count: 2)
 Player: Bud
 Player: Lou
Team name: Marx Brothers (roster count: 3)
 Player: Chico
 Player: Groucho
 Player: Harpo
Team name: Burns and Allen (roster count: 2)
 Player: George
 Player: Gracie
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.561s
[INFO] Finished at: Sat Aug 03 16:52:19 COT 2013
[INFO] Final Memory: 14M/154M
[INFO] ------------------------------------------------------------------------

person Antonio Paternina    schedule 03.08.2013    source источник


Ответы (1)


Я создал этот же веб-сервис около недели назад. Я сделал новый проект в Eclipse и создал пакеты ch01.teams.service и ch01.teams.client (названия пакетов немного отличаются от названий в книге, но идея та же). Это намного проще, чем иметь дело с Maven, и это сработало для меня.

Если вы хотите продолжать использовать Maven, вам может просто понадобиться добавить com.sun.istack.localization.Localizable в ваш путь к классам (из описания я не уверен, есть ли он у вас или нет). Если вы перейдете на http://www.jarfinder.com/index.php/java/info/com.sun.istack.localization.Localizable вы можете видеть, что он находится в jaxb-impl-2.1.8.jar, поэтому, если вы можете загрузить этот jar и поместить его в ваш classpath вам может быть хорошо идти.

person Paul J Abernathy    schedule 22.08.2013