Проблема запуска jar приложения, использующего веб-сервис

 
 
 
Сообщения:25
Всем привет! Я написал приложение, получающее данные о курсах валют с сервера центробанка России. В intellij все ок, работает. Но стоит сделать jar с использованием maven. Как возникают проблемы. Последнее, что сделал, это добавил в pom плагин:
<plugin>
                <groupId>org.jvnet.jax-ws-commons</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                        <configuration>
                            <wsdlDirectory>src/main/resources/META-INF/client</wsdlDirectory>
                            <wsdlFiles>
                                <wsdlFile>DailyInfo.wsdl</wsdlFile>
                            </wsdlFiles>
                            <wsdlLocation>/META-INF/client/*</wsdlLocation>
                            <packageName>ru.rt.integration.rms.services</packageName>
                        </configuration>
                        <id>wsimport-generate-LoaderService</id>
                        <phase>generate-sources</phase>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>javax.xml</groupId>
                        <artifactId>webservices-api</artifactId>
                        <version>1.4</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
                    <xnocompile>false</xnocompile>
                    <verbose>true</verbose>
                    <extension>true</extension>
                </configuration>
            </plugin>

То есть у меня файл DailyInfo.xml расположен в src/main/resources/META-INF/client. Это файл запроса на веб-сервис. Получил следующее:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException:
file:/E:/Java/!Labs/ExchangeRateDemo/out/artifacts/ExchangeRateDemo_jar/ExchangeRateDemo.jar!/fxml/main.fxml

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.load(Unknown Source)
at gui.main.Main.start(Main.java:21)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
... 1 more
Caused by: javax.xml.ws.WebServiceException: Provider com.sun.xml.ws.spi.ProviderImpl not found
at javax.xml.ws.spi.FactoryFinder.newInstance(FactoryFinder.java:38)
at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:133)
at javax.xml.ws.spi.Provider.provider(Provider.java:82)
at javax.xml.ws.Service.<init>(Service.java:56)
at ru.cbr.web.DailyInfo.<init>(DailyInfo.java:40)
at gui.main.MainController.setXMLres(MainController.java:141)
at gui.main.MainController.initialize(MainController.java:137)
... 18 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at javax.xml.ws.spi.FactoryFinder.newInstance(FactoryFinder.java:34)
... 24 more
Exception running application gui.main.Main

Не знаю куда копать, очень большая просьба помочь разобраться...
 
 
Сообщения:366
ну, к примеру же пишет
com.sun.xml.ws.spi.ProviderImpl не найден, осталось понять откуда этот класс и почему его библиотеки нет в конечном jar файле
 
 
Сообщения:25
keekkenen:
com.sun.xml.ws.spi.ProviderImpl не найден, осталось понять откуда этот класс и почему его библиотеки нет в конечном jar файле
- да, спасибо. Оказалось, что этот класс входит в webservices-rt и его нужно импортировать зависимостью
<groupId>com.sun.xml.ws</groupId>
            <artifactId>webservices-rt</artifactId>
            <version>2.0</version>

После добавления зависимости эта ошибка пропала. Но остались следующие:

java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException:
file:/E:/Java/!Labs/ExchangeRateDemo/out/artifacts/ExchangeRateDemo_jar/ExchangeRateDemo.jar!/fxml/main.fxml

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.load(Unknown Source)
at gui.main.Main.start(Main.java:21)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
... 1 more
Caused by: javax.xml.ws.WebServiceException: Failed to access the WSDL at: file:DailyInfo.xml. It failed with:
DailyInfo.xml (Не удается найти указанный файл).
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:184)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:166)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:131)
at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:267)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:230)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:178)
at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:106)
at javax.xml.ws.Service.<init>(Service.java:57)
at ru.cbr.web.DailyInfo.<init>(DailyInfo.java:40)
at gui.main.MainController.setXMLres(MainController.java:141)
at gui.main.MainController.initialize(MainController.java:137)
... 18 more
Caused by: java.io.FileNotFoundException: DailyInfo.xml (Не удается найти указанный файл)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(Unknown Source)
at java.base/java.io.FileInputStream.<init>(Unknown Source)
at java.base/java.io.FileInputStream.<init>(Unknown Source)
at java.base/sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at java.base/java.net.URL.openStream(Unknown Source)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:837)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.java:294)
at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:151)
... 27 more
Exception running application gui.main.Main

И DailyInfo.xml находится в корне jar и main.fxml также находится там, где нужно. Я попробовал сделать jar просто с gui, без функционала запроса к веб-сервису - работает. Что вот с этим делать?
 
 
Сообщения:300
А покажите окрестности ru.cbr.web.DailyInfo.<init>(DailyInfo.java:40) и gui.main.MainController.setXMLres(MainController.java:141)?

У вас DailyInfo.xml находится в jar (и максимум является ресурсом) а обращаетесь вы к нему как к файлу (объекту на диске а не в другом контейнере). Т.е. вот этот вот " file:DailyInfo.xml" из трейса при таком коде - это именно файл на диске а не внутри другого контейнера.
При этом ws.Service в конструкторе получает URL, который, в отличие от файла, может описывать файл внутри jar-архива (но только один уровень, нельзя файл внутри jar внутри jar). Указанные строчки - это как раз место, где наиболее вероятно вы что-то делаете не так.
 
 
Сообщения:25
maxkar:
А покажите окрестности ru.cbr.web.DailyInfo.<init>(DailyInfo.java:40)


public class DailyInfo
    extends Service
{

    private final static URL DAILYINFO_WSDL_LOCATION;
    private final static WebServiceException DAILYINFO_EXCEPTION;
    private final static QName DAILYINFO_QNAME = new QName("http://web.cbr.ru/", "DailyInfo");

    static {
        URL url = null;
        WebServiceException e = null;
        try {
            url = new URL("file:DailyInfo.xml");
        } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
        DAILYINFO_WSDL_LOCATION = url;
        DAILYINFO_EXCEPTION = e;
    }

    public DailyInfo() {
        super(__getWsdlLocation(), DAILYINFO_QNAME);
    }


maxkar:
gui.main.MainController.setXMLres(MainController.java:141)


DailyInfo service = new DailyInfo();


Да, все верно. URL ссылается на file:DailyInfo.xm. Как я пытался это исправить: сначала пытался вручную ввести вместо file: classpath: Потом использовал плагин maven для генерации классов из wsdl файла с указанием в пути classpath: - ни то, ни другое не прошло. Затем я еще порылся в инете нашел совет прописать путь к файлу как http://localhost/wsdl/DailyInfo.wsdl и использовать XML JAX-WS-catalog.xml для доступа к файлу. Вот я только не совсем понял. Я указал компилятору путь http://localhost/wsdl/DailyInfo.wsdl, расположил где надо JAX-WS-catalog.xml Компилятору нужно как-то указать на этот самый xml... В общем этот вариант не прошел. Если что-то посоветуете, буду очень признателен...
 
 
Сообщения:300
В данном случае должен сработать простейший вариант:
url = DailyInfo.class.getResource("/DailyInfo.xml")


Class.getResource/Class.getResourceAsStream как раз предназначены для работы с ресурсами приложения и библиотеки (картинки, описания и прочее). Исходно ресурс - это "файл", но при публикации приложения (или библиотеки) он упаковывается вместе с классами. Эти методы делегируются ClassLoader'у, который знает как создавать URL и как получать доступ к содержимому. Эта пара методов - универсальная, т.е. работает и когда ресурсы в jar-файле (вместе с классами проекта), и когда все эти файлы россыпью (в IDE, даже не обязательно в одном каталоге все). В этих сценариях немного разные classloader'ы используются (или сконфигурированы по-разному).

В данном случае URL будет jar:file://..., можете для интереса распечатать. А использовать все равно getResource - это более переносимо.

Идея classpath:... у вас была в правильном направлении. Она может даже работать с какими-то библиотеками, но это уже свойства библиотек (и внутри они почти всегда сводятся в вызову getResouce).

И еще одно замечание. Не нужно путать "весь classpath" и то, что ищет getResource. getResource ищет в иерархии загрузчиков конкретного класса. И если вдруг у вас есть много jar и развитая иерархия загрузчиков - нужно внимательно следить, через какие classloader происходит загрузка. При обычной разработке это не нужно - ресурсы идут с библиотекой (в одном jar) и MyClass.class.getResource(...) будет работать правильно для любого класса из библиотеки (это может быть для различных иконок полезно, какие-нибудь справочные тексты и т.п.)
 
 
Сообщения:25
maxkar:
В данном случае должен сработать простейший вариант:
- действительно просто). Я столько времени убил на поиски каких-то непростых способов... Меня почему-то сбило с толку это объявление url. А ведь getClass().getResource() и дает url. Мне бы ваше понимание вопроса... Так много всего в java... и далеко не все сразу доходит до четкого понимания.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет