Спружына кампанент-сканаванне зламанай ў кантэйнеры OSGi

Я спрабую інтэграваць спружынны DI ў існуючы праект JAXWS. У мяне гэта працуе лакальна на кату, але пры разгортванні ў выдалены кантэйнер ён не з'яўляецца, каб зрабіць сканаванне CLASSPATH. Я мог бы бачыць у часопісах, што кот ён рэгіструе мае @Components як бабы, але на выдаленым серверы, яны не згадваецца наогул.

Што я бачу, гэта ніжэй StackTrace. Падобна на тое, гэта ўніз да мудрагелістым вэб-кантэйнеры я павінен выкарыстоўваць. Гэта «інтэграваны сервер прыкладанняў для IBM я». http://www-03.ibm.com/systems/i/software/ МСФС/ Я лічу, што гэта пабудавана на архітэктуры зацьмення і пры ўсталёўцы вайны файла, ён пераўтворыць кожнае прыкладанне ў пучок. Гэта выдатна, але гэта разбівае маё сканаванне CLASSPATH. :(

Хто-небудзь ёсць рашэнне для гэтага? дзякуй

673 [Thread-6] WARN  org.springframework.core.io.support.PathMatchingResourcePatternResolver  - Cannot search for matching files underneath URL [bundleresource://32/com/company/application/] because it does not correspond to a directory in the file system
java.io.FileNotFoundException: URL [bundleresource://32/com/company/application/] cannot be resolved to absolute file path because it does not reside in the file system: bundleresource://32/com/company/application/
    at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205)
    at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
    at org.springframework.core.io.UrlResource.getFile(UrlResource.java:169)
    at org.springframework.core.io.support.PathMatchingResourcePatternResolver.doFindPathMatchingFileResources(PathMatchingResourcePatternResolver.java:526)
    at org.springframework.web.context.support.ServletContextResourcePatternResolver.doFindPathMatchingFileResources(ServletContextResourcePatternResolver.java:92)
    at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:347)
    at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:266)
    at org.springframework.context.support.AbstractApplicationContext.getResources(AbstractApplicationContext.java:1269)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:248)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
    at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1678)
    at com.ibm.ws.webcontainer.webapp.WebApp.commonInitializationFinish(WebApp.java:371)
    at com.ibm.ws.webcontainer.webapp.WebApp.initialize(WebApp.java:347)
    at com.ibm.ws.webcontainer.webapp.WebGroup.addWebApplication(WebGroup.java:134)
    at com.ibm.ws.webcontainer.VirtualHost.addWebApplication(VirtualHost.java:145)
    at com.ibm.ws.webcontainer.WebContainer.addWebApp(WebContainer.java:542)
    at com.ibm.ws.webcontainer.WebContainer.addWebApplication(WebContainer.java:513)
    at com.ibm.pvc.internal.webcontainer.trackers.WebApplicationServiceTracker.addingService(WebApplicationServiceTracker.java:94)
    at org.osgi.util.tracker.ServiceTracker$Tracked.trackAdding(ServiceTracker.java:1064)
    at org.osgi.util.tracker.ServiceTracker$Tracked.trackInitialServices(ServiceTracker.java:926)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:330)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:274)
    at com.ibm.pvc.internal.webcontainer.trackers.XMLParserServiceTracker.initializeTrackers(XMLParserServiceTracker.java:520)
    at com.ibm.pvc.internal.webcontainer.trackers.XMLParserServiceTracker.startWebcontainer(XMLParserServiceTracker.java:235)
    at com.ibm.pvc.internal.webcontainer.trackers.XMLParserServiceTracker.addingService(XMLParserServiceTracker.java:140)
    at org.osgi.util.tracker.ServiceTracker$Tracked.trackAdding(ServiceTracker.java:1064)
    at org.osgi.util.tracker.ServiceTracker$Tracked.trackInitialServices(ServiceTracker.java:926)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:330)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:274)
    at com.ibm.pvc.internal.webcontainer.WebContainerActivator.start(WebContainerActivator.java:45)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:1009)
    at java.security.AccessController.doPrivileged(AccessController.java:251)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:1003)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:984)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:350)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:279)
    at com.ibm.rcp.internal.util.BundleManager.start(BundleManager.java:74)
    at com.ibm.rcp.internal.util.BundleManager.start(BundleManager.java:179)
    at com.ibm.rcp.lifecycle.internal.application.BundleControlImpl.start(BundleControlImpl.java:125)
    at com.ibm.rcp.lifecycle.internal.application.BundleControlImpl.start(BundleControlImpl.java:106)
    at com.ibm.rcp.lifecycle.application.BundleControl.start(BundleControl.java:89)
    at com.ibm.lwi.application.LWIApplication.run(LWIApplication.java:149)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:600)
    at org.eclipse.equinox.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:574)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:195)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:600)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:561)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:501)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1239)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1215)
    at org.eclipse.core.launcher.Main.main(Main.java:30)
    at com.ibm.lwi.LaunchLWI$1.run(LaunchLWI.java:731)  

Гледзячы на ​​код, які выкідвае выключэнне, гэта праверка, калі пратакол файла: //.

if (!URL_PROTOCOL_FILE.equals(resourceUrl.getProtocol())) {
            throw new FileNotFoundException(
                    description + " cannot be resolved to absolute file path " +
                    "because it does not reside in the file system: " + resourceUrl);

Я магу бачыць, што прыкладанне было уварвалася на файлавую сістэму. Цікава, ці ёсць спосаб, каб перавызначыць гэты загрузнік вясной не клапаціцца аб пратаколе і, відавочна, да гэтага часу працуе? Я не клапачуся за асаблівасці OSGi кантэйнера. Я проста хачу, каб маё прыкладанне для разгортвання.

Запасны варыянт, здаецца, адмовіцца ад сканавання ў шляху да класаў карысці вызначэння бабоў ў XML, але гэта, d рэальны крок назад имо. :(

4
дададзена аўтар SpaceTrucker, крыніца
Вы можаце зарэгістраваць свае кампаненты ў якасці OSGi паслуг на пачак на аснове. Пры нутравенных уводзінах залежнасцяў затым трэба разгледзець зарегестированные OSGi.
дададзена аўтар SpaceTrucker, крыніца
Я не ведаю, чаму вы downvoted небудзь. Я upvoted, але гэта толькі вяртае вас да нуля, прабачце! Я зраблю дадатковыя каментары ў тэме прыкладаецца да майго адказу ніжэй.
дададзена аўтар Neil Bartlett, крыніца
Я не ведаю, чаму вы downvoted небудзь. Я upvoted, але гэта толькі вяртае вас да нуля, прабачце! Я зраблю дадатковыя каментары ў тэме прыкладаецца да майго адказу ніжэй.
дададзена аўтар Neil Bartlett, крыніца
Акрамя таго, я вельмі ўдзячны тым, хто адгукнуўся публічна. Яны ўсе былі карысныя, каб дапамагчы мне вырашыць, што рабіць.
дададзена аўтар Ben Thurley, крыніца
Акрамя таго, я вельмі ўдзячны тым, хто адгукнуўся публічна. Яны ўсе былі карысныя, каб дапамагчы мне вырашыць, што рабіць.
дададзена аўтар Ben Thurley, крыніца
Было б добра, калі б людзі патлумачылі, чаму яны прагаласавалі ўніз. Гэта сапраўдны пытанне, які я затрымаўся на і да гэтага часу адказы альбо не працавалі або проста крытыкавалі з дапамогай сканавання CLASSPATH. Я думаў, што гэта было даволі неад'емнай часткай спружыны, якая сама па сабе з'яўляецца асноўнай шырока выкарыстоўваюцца рамкі. У мяне была гэтая OSGi архітэктура навязаную мне кантэйнерам, я павінен выкарыстоўваць. Я ў цяперашні час ацэньвае свае варыянты.
дададзена аўтар Ben Thurley, крыніца
Было б добра, калі б людзі патлумачылі, чаму яны прагаласавалі ўніз. Гэта сапраўдны пытанне, які я затрымаўся на і да гэтага часу адказы альбо не працавалі або проста крытыкавалі з дапамогай сканавання CLASSPATH. Я думаў, што гэта было даволі неад'емнай часткай спружыны, якая сама па сабе з'яўляецца асноўнай шырока выкарыстоўваюцца рамкі. У мяне была гэтая OSGi архітэктура навязаную мне кантэйнерам, я павінен выкарыстоўваць. Я ў цяперашні час ацэньвае свае варыянты.
дададзена аўтар Ben Thurley, крыніца
Кірмаш пункт аб сканаванні, але шляхі да класаў, як яшчэ можна акуратна падключыць свае кампаненты? Як я магу ісці аб рэгістрацыі ў якасці кампанентаў OSGi паслуг? Гэта становіцца брудным, як я не выкарыстоўваю ў OSGi кантэйнер для лакальнага тэставання. Я нават не хвалюе, што аддалены сервер OSGi, я проста хачу, каб мець магчымасць разгарнуць маё прыкладанне.
дададзена аўтар Ben Thurley, крыніца
Кірмаш пункт аб сканаванні, але шляхі да класаў, як яшчэ можна акуратна падключыць свае кампаненты? Як я магу ісці аб рэгістрацыі ў якасці кампанентаў OSGi паслуг? Гэта становіцца брудным, як я не выкарыстоўваю ў OSGi кантэйнер для лакальнага тэставання. Я нават не хвалюе, што аддалены сервер OSGi, я проста хачу, каб мець магчымасць разгарнуць маё прыкладанне.
дададзена аўтар Ben Thurley, крыніца

9 адказы

Я ненавіджу ідэю, адказваючы на ​​мой уласны пытанне, але ён, здавалася, лепшы спосаб паведаміць, што я зрабіў. Я upvoted адказаў да гэтага часу, таму што яны былі карысныя для мяне, каб прыняць рашэнне.

Праз чытання адказаў я даведаўся крыху аб тым, чаму сканаванне шляху да класаў дрэнна. Тым не менш, гэта даволі агульная частка спружыннай структуры ў гэтыя дні. Маё рашэнне было ісці «стары SKOOL» і ўручную вызначыць мае бабы.

Не магу зрабіць гэта:


Зрабіце гэта замест таго, каб:



Вы можаце па крайняй меры, да гэтага часу гэта зрабіць:


Анатацыя канфігурацыя азначае вясна будзе яшчэ тэлеграму вашыя бабы разам, гэта проста працэс выяўлення бабоў, што робіцца ўручную. Гэта кампраміс.

У ідэале я палічыў за лепшае б сродкі для разгортвання праекта з кампанентам сканавання, але ад таго, што я магу сабраць гэта патрабуе змены спосабу праект створаны адмыслова для кантэйнера OSGi. Мой адказ азначае, што ён будзе працаваць як у OSGi і звычайны кантэйнер, так што гэта менш спэцыялізаваўся.

Калі хтосьці знойдзе спосаб, каб разгарнуць ваенны файл сканаванне кампанентаў спружыннага то я з задавальненнем перагледжу прыняты адказ.

дзякуй

7
дададзена
Досыць дзіўна, але мы як раз мадэрнізавалі ўчора ад МСФС 8,1 да 8,5. Старая версія была заснавана на «лотас экспедытар», і я ніколі не быў, што ўражаны з ім, і гэта было адным з некалькіх абыходных мне давялося выкарыстоўваць. 8.5, як уяўляецца, грунтавацца на WAS і бясконца лепш. Гэта значна хутчэй, старт/стоп, вы можаце ўсталяваць параметры JVM больш лёгка, вы можаце выбраць JRE так больш не фіксуецца на 6 і я цалкам упэўнены, што цяпер будзе падтрымліваць сканаванне CLASSPATH. Мне трэба, каб праверыць яго, але калі ён пабудаваны на WAS, то ён павінен рабіць. Калі вы на IBM я, то абавязкова глядзець у мадэрнізацыі.
дададзена аўтар Ben Thurley, крыніца
Дзякуй за абмен, гэта дазволіла мне, нарэшце, зрабіць яго працу! Здаецца, тры гады праз <�я> яшчэ з'яўляецца праблемай.
дададзена аўтар Jan Goyvaerts, крыніца

Я ненавіджу ідэю, адказваючы на ​​мой уласны пытанне, але ён, здавалася, лепшы спосаб паведаміць, што я зрабіў. Я upvoted адказаў да гэтага часу, таму што яны былі карысныя для мяне, каб прыняць рашэнне.

Праз чытання адказаў я даведаўся крыху аб тым, чаму сканаванне шляху да класаў дрэнна. Тым не менш, гэта даволі агульная частка спружыннай структуры ў гэтыя дні. Маё рашэнне было ісці «стары SKOOL» і ўручную вызначыць мае бабы.

Не магу зрабіць гэта:


Зрабіце гэта замест таго, каб:



Вы можаце па крайняй меры, да гэтага часу гэта зрабіць:


Анатацыя канфігурацыя азначае вясна будзе яшчэ тэлеграму вашыя бабы разам, гэта проста працэс выяўлення бабоў, што робіцца ўручную. Гэта кампраміс.

У ідэале я палічыў за лепшае б сродкі для разгортвання праекта з кампанентам сканавання, але ад таго, што я магу сабраць гэта патрабуе змены спосабу праект створаны адмыслова для кантэйнера OSGi. Мой адказ азначае, што ён будзе працаваць як у OSGi і звычайны кантэйнер, так што гэта менш спэцыялізаваўся.

Калі хтосьці знойдзе спосаб, каб разгарнуць ваенны файл сканаванне кампанентаў спружыннага то я з задавальненнем перагледжу прыняты адказ.

дзякуй

7
дададзена
Досыць дзіўна, але мы як раз мадэрнізавалі ўчора ад МСФС 8,1 да 8,5. Старая версія была заснавана на «лотас экспедытар», і я ніколі не быў, што ўражаны з ім, і гэта было адным з некалькіх абыходных мне давялося выкарыстоўваць. 8.5, як уяўляецца, грунтавацца на WAS і бясконца лепш. Гэта значна хутчэй, старт/стоп, вы можаце ўсталяваць параметры JVM больш лёгка, вы можаце выбраць JRE так больш не фіксуецца на 6 і я цалкам упэўнены, што цяпер будзе падтрымліваць сканаванне CLASSPATH. Мне трэба, каб праверыць яго, але калі ён пабудаваны на WAS, то ён павінен рабіць. Калі вы на IBM я, то абавязкова глядзець у мадэрнізацыі.
дададзена аўтар Ben Thurley, крыніца
Дзякуй за абмен, гэта дазволіла мне, нарэшце, зрабіць яго працу! Здаецца, тры гады праз <�я> яшчэ з'яўляецца праблемай.
дададзена аўтар Jan Goyvaerts, крыніца

Для вашага вэб-прыкладанні для працы з вясной вам трэба спружынны дм, і таму вам трэба мець нешта накшталт наступнага:

    
    contextClass
    org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext

Or for a complete sample take a look at the spring-osgi sample at pax-web: Sample web.xml

2
дададзена
Я не ўпэўнены, што вы спрабуеце зрабіць, але ўзор ўяўляе сабой узор WAB і калі вы хочаце, каб праверыць яго вам патрэбен OSGi, здольны вэб-кантэйнер, напрыклад, Pax-Web. Гэта не тое, каб дадаць у дадатак.
дададзена аўтар Achim Nierbeck, крыніца
Адразу ж узнікаюць праблемы. Спрабаваў дадаваць вясна-OSGi-сетку як Maven залежнасці, але цяпер зборка парушаецца, таму што ён не можа дазволіць сэрвлета-api.osgi. Старонка Maven для гэтага вяртае 404. :( mvnrepository.com/artifact /org.springframework.osgi/…
дададзена аўтар Ben Thurley, крыніца
Гэта больш падобна на тое, што я хацеў. Я буду гуляць з гэтым і ўбачыць, калі я магу прымусіць яго працаваць. У мяне няма шмат часу, на жаль, так спадзяюся, што яго не вельмі складана. Прывітання.
дададзена аўтар Ben Thurley, крыніца

Для вашага вэб-прыкладанні для працы з вясной вам трэба спружынны дм, і таму вам трэба мець нешта накшталт наступнага:

    
    contextClass
    org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext

Or for a complete sample take a look at the spring-osgi sample at pax-web: Sample web.xml

2
дададзена
Я не ўпэўнены, што вы спрабуеце зрабіць, але ўзор ўяўляе сабой узор WAB і калі вы хочаце, каб праверыць яго вам патрэбен OSGi, здольны вэб-кантэйнер, напрыклад, Pax-Web. Гэта не тое, каб дадаць у дадатак.
дададзена аўтар Achim Nierbeck, крыніца
Адразу ж узнікаюць праблемы. Спрабаваў дадаваць вясна-OSGi-сетку як Maven залежнасці, але цяпер зборка парушаецца, таму што ён не можа дазволіць сэрвлета-api.osgi. Старонка Maven для гэтага вяртае 404. :( mvnrepository.com/artifact /org.springframework.osgi/…
дададзена аўтар Ben Thurley, крыніца
Гэта больш падобна на тое, што я хацеў. Я буду гуляць з гэтым і ўбачыць, калі я магу прымусіць яго працаваць. У мяне няма шмат часу, на жаль, так спадзяюся, што яго не вельмі складана. Прывітання.
дададзена аўтар Ben Thurley, крыніца

Я паспрабаваў каментуючы свой першапачатковы пост, аднак я не магу зрабіць гэта з-за мой рэйтынг у StackOverflow, на жаль. Не зразумейце мяне няправільна, я не кажу, што ў мяне ёсць рашэнне, але я хацеў бы падзяліцца абыходным шляхам у новай версіі Spring Framework тут.

Па-першае, у мяне ёсць вялікі клас канфігурацыі, які серверы як запіс у гэтым AnnotationConfigApplicationContext (PseudoSpringBootApplication.class) заяву.

/**
 * This class serves as the entry point from OSGI framework to Spring framework
 *
 */
@Configuration
//@ComponentScan
//@SpringBootApplication
public class PseudoSpringBootApplication {

  @Autowired
  ApplicationContext context;

  @Bean
  DummySpringBean1 dummySpringBean1() {
    return new DummySpringBean("This is a dummy message");
  }

  @Bean
  DummySpringBean2 dummySpringBean2() {
    return new DummySpringBean("This is a dummy message");
  }

}

У прынцыпе, як і @ComponentScan не працуе з OSGI убудова, (як ужо згадвалася ў вас адказаць пост, гэта ў асноўным з-за таго, што Spring Framework спрабуюць сканаваць класы, якія прадугледжваюць артэфакты знаходзяцца ў файлавай сістэме, аднак, у гэтым выпадку, OSGI (напрыклад, Apache Felix) пераўтварыла FILE://URL прыстаўкі да яго ўнутранай пачку://прыстаўцы. <�Код> java.io.FileNotFoundException: URL [расслаенне: //21.0: 1/кім/***] не можа быць дазволена да абсалютнага шляху да файла, так як ён не знаходзіцца ў файлавай сістэме: расслаенне: //21.0: 1/кім/* ** <�Моцны> Тым не менш, @Autowired усё яшчэ працуе. Я паказаў прыклад кода ніжэй, дзе DummySpringBean2 мае залежнасць DummySpringBean1 і @Autowired анатаваны.

//@Component
class DummySpringBean1 {

  private final String dummyMessage;

  DummySpringBean1(String dummyMessage) {
    this.dummyMessage = dummyMessage;
  }
}

Для DummySpringBean2, ён мае залежнасць ад DummySpringBean1.

//@Component
class DummySpringBean2 {

  private final String dummyMessage;

  @Autowired
  private DummySpringBean1 bean1;

  DummySpringBean(String dummyMessage) {
    this.dummyMessage = dummyMessage;
  }
}

Так што я пераехаў ўсе дэкларацыі боба да цэнтральнага класу канфігурацыі вышэй.

2
дададзена
Проста, каб вы ведаеце маё меркаванне па гэтым пытанні: калі гэта абыходны шлях, гэта свайго роду рашэнне. Акрамя таго, я не ведаю, як вы б змясціцца гэта ў каментары. З іншага боку, мае веды вясны нізкія, я не магу сказаць шмат пра самае абыходнага. Ці магу я заклікаю вас, каб спрыяць сайту. Прывітання.
дададзена аўтар lrnzcig, крыніца
Гэта, па сутнасці, такі ж, як маё рашэнне, за выключэннем, што вы карыстаецеся Java @Configuration замест xml канфігурацыі, каб зарэгістраваць бабы. Гэта добрая прапанова, хоць.
дададзена аўтар Ben Thurley, крыніца
@Irnzcig, дзякуй за падтрымку. Я буду рабіць больш, спрыяльнымі сайта напэўна, і я адчуваю патрэбнасць падзяліцца сваім вопытам распрацоўшчыкаў да большай колькасці распрацоўшчыкаў, асабліва малодшага распрацоўніка.
дададзена аўтар imarchuang, крыніца

Classpath сканаванне жудасная ідэя, і яна зламаецца ў многіх асяроддзях выканання, а не толькі ў OSGi. Рэестр OSGi службы з'яўляецца значна больш эфектыўным падыходам да праблемы развязкі.

Вы можаце выкарыстоўваць OSGi Service Registry па-за самім OSGi, зірніце на PojoSR .

Што тычыцца Як зарэгістравацца і спажываем OSGi паслугі ... так як вы карыстаецеся Spring, было б лепш выкарыстоўваць = "NOFOLLOW"> Blueprint , які з'яўляецца развіццём больш старога праекта пад назвай Spring Dynamic Modules.

1
дададзена
Я не магу адказаць на ваша пытанне, таму што я перастаў выкарыстоўваць Spring даўно; але я быў бы вельмі здзіўлены, калі сканаванне было класы адзіным шляхам, таму што Вясновых архітэктары павінны ведаць лепш, чым гэта. Я думаю, калі вы капае глыбока ў дакументацыі, вы можаце быць у стане знайсці механізм API або пашырэнне, якое дазваляе кантраляваць працэс выяўлення для анатаваных бабоў. Поспехі ... калі вы знойдзеце адказ, не забудзьцеся напісаць тут тут.
дададзена аўтар Neil Bartlett, крыніца
Так што я працягваю быць сказаным. Аднак, гэта даволі неад'емная частка спружыннага каркаса. Вядома, ёсць спосаб, каб атрымаць гэтыя прыкладання працаваць без перапісвання іх у стылі OSGi?
дададзена аўтар Ben Thurley, крыніца

Classpath сканаванне жудасная ідэя, і яна зламаецца ў многіх асяроддзях выканання, а не толькі ў OSGi. Рэестр OSGi службы з'яўляецца значна больш эфектыўным падыходам да праблемы развязкі.

Вы можаце выкарыстоўваць OSGi Service Registry па-за самім OSGi, зірніце на PojoSR .

Што тычыцца Як зарэгістравацца і спажываем OSGi паслугі ... так як вы карыстаецеся Spring, было б лепш выкарыстоўваць = "NOFOLLOW"> Blueprint , які з'яўляецца развіццём больш старога праекта пад назвай Spring Dynamic Modules.

1
дададзена
Я не магу адказаць на ваша пытанне, таму што я перастаў выкарыстоўваць Spring даўно; але я быў бы вельмі здзіўлены, калі сканаванне было класы адзіным шляхам, таму што Вясновых архітэктары павінны ведаць лепш, чым гэта. Я думаю, калі вы капае глыбока ў дакументацыі, вы можаце быць у стане знайсці механізм API або пашырэнне, якое дазваляе кантраляваць працэс выяўлення для анатаваных бабоў. Поспехі ... калі вы знойдзеце адказ, не забудзьцеся напісаць тут тут.
дададзена аўтар Neil Bartlett, крыніца
Так што я працягваю быць сказаным. Аднак, гэта даволі неад'емная частка спружыннага каркаса. Вядома, ёсць спосаб, каб атрымаць гэтыя прыкладання працаваць без перапісвання іх у стылі OSGi?
дададзена аўтар Ben Thurley, крыніца

Я зрабіў гэты невялікі скрыпт для Linux, так што я распакаваць TrackServer.jar і выканаць асноўны клас, не губляючы прастаты з вясны (NEWB да вясны тут, так што не так прыемна манеўраваць і дадаць дадатковы код там)

# Remove any old file before new version
rm -rf tracker;
# Recreate executable folder
mkdir tracker;
# copy main jar to executable folder
cp TrackServer.jar tracker;
# move to executable folder
cd tracker;
# Extract jar on executable folder
jar xf TrackServer.jar;
# Execute main class (at the end of the line) 
# with all the jar dependencies that came 
# in original TrackerServer.jar
java -cp '.;'`ls -dm *.jar | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' | sed -e 's/,[ \n\r\t]/:/g'` incodemode.mainApp.Main;
# sed bits are for getting .:dependency1.jar:dependency2.jar etc...
# incodemode.mainApp.Main is the full class path of the Main class
0
дададзена
Ці з'яўляецца гэта адказ на іншае пытанне?
дададзена аўтар Ben Thurley, крыніца
Магчыма, вы мелі падобную памылку, але я не думаю, што гэта тая ж самая праблема. Мая праблема атрымання сканавання вясной шлях да класаў для працы з кантэйнерам OSGi. Мы выкарыстоўваем на нашых кот мясцовых машын і сканаванне не працуе класы ніякіх праблем.
дададзена аўтар Ben Thurley, крыніца
Так, не хацеў рабіць ручной пошук, гэта здарылася са мной з кантролерамі, але памылка была тым жа, так што замест гэтага пераехала ў бітавы код файлавай сістэмы, пазней я пераехаў яго/запусціць/ГИМ/трэкер замест/вару/WWW /.../ трэкер. Калі прыбраць каментары ў вас ёсць толькі некалькі радкоў, ах, і гэты праект запускае свой уласны кот. Размешчаныя яго тут, бо памылка была аднолькавай на нізкім узроўні, і гэта быў адказ, што Google даў мне пры пошуку памылкі.
дададзена аўтар Luis Mauricio, крыніца

Я зрабіў гэты невялікі скрыпт для Linux, так што я распакаваць TrackServer.jar і выканаць асноўны клас, не губляючы прастаты з вясны (NEWB да вясны тут, так што не так прыемна манеўраваць і дадаць дадатковы код там)

# Remove any old file before new version
rm -rf tracker;
# Recreate executable folder
mkdir tracker;
# copy main jar to executable folder
cp TrackServer.jar tracker;
# move to executable folder
cd tracker;
# Extract jar on executable folder
jar xf TrackServer.jar;
# Execute main class (at the end of the line) 
# with all the jar dependencies that came 
# in original TrackerServer.jar
java -cp '.;'`ls -dm *.jar | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' | sed -e 's/,[ \n\r\t]/:/g'` incodemode.mainApp.Main;
# sed bits are for getting .:dependency1.jar:dependency2.jar etc...
# incodemode.mainApp.Main is the full class path of the Main class
0
дададзена
Ці з'яўляецца гэта адказ на іншае пытанне?
дададзена аўтар Ben Thurley, крыніца
Магчыма, вы мелі падобную памылку, але я не думаю, што гэта тая ж самая праблема. Мая праблема атрымання сканавання вясной шлях да класаў для працы з кантэйнерам OSGi. Мы выкарыстоўваем на нашых кот мясцовых машын і сканаванне не працуе класы ніякіх праблем.
дададзена аўтар Ben Thurley, крыніца
Так, не хацеў рабіць ручной пошук, гэта здарылася са мной з кантролерамі, але памылка была тым жа, так што замест гэтага пераехала ў бітавы код файлавай сістэмы, пазней я пераехаў яго/запусціць/ГИМ/трэкер замест/вару/WWW /.../ трэкер. Калі прыбраць каментары ў вас ёсць толькі некалькі радкоў, ах, і гэты праект запускае свой уласны кот. Размешчаныя яго тут, бо памылка была аднолькавай на нізкім узроўні, і гэта быў адказ, што Google даў мне пры пошуку памылкі.
дададзена аўтар Luis Mauricio, крыніца