Her iki zincir aynı pakette bittiğinde kullanım kısıtlamaları neden ihlal ediliyor?


151

Her biri sadece bir manifest içeren dört demetim var. Paketler

  • apphangi ithalat com.example.foo.fragmentvecom.example.bar
  • foo hangi ihracatlar com.example.foo;uses:=com.example.foo.cfg
  • foo.fragmentfoobu ihracata bağlı bir parça com.example.foo.fragmentvecom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
  • barhangi ihracat com.example.barve ithalatcom.example.foo

Paket düzeyinde bağımlılık grafiği :

app -> bar
|       |
|       v
|      foo
|       |
v       v
foo.fragment

Bu paketleri JBoss AS 7.2'ye bir kerede kurduğumda, gayet iyi çalışıyorlar. Ancak, apppaketi ilk kez veya başarıyla başladıktan ve kaldırdıktan sonra diğerlerinden sonra yüklersem , aşağıdaki kısıtlama ihlali kullanılır:

Caused by: org.osgi.service.resolver.ResolutionException: Uses constraint violation. Unable to resolve resource com.example.app [HostBundleRevision[com.example.app:0.0.
0]] because it is exposed to package 'com.example.foo.fragment' from resources com.example.foo [HostBundleRevision[com.example.foo:0.0.0]] and com.example.foo [HostBund
leRevision[com.example.foo:0.0.0]] via two dependency chains.

Chain 1:
  com.example.app [HostBundleRevision[com.example.app:0.0.0]]
    import: null
     |
    export: osgi.wiring.package=com.example.foo.fragment
  com.example.foo [HostBundleRevision[com.example.foo:0.0.0]]

Chain 2:
  com.example.app [HostBundleRevision[com.example.app:0.0.0]]
    import: null
     |
    export: osgi.wiring.package=com.example.bar; uses:=com.example.foo
  com.example.bar [HostBundleRevision[com.example.bar:0.0.0]]
    import: null
     |
    export: osgi.wiring.package=com.example.foo; uses:=com.example.foo.fragment
    export: osgi.wiring.package=com.example.foo.fragment
  com.example.foo [HostBundleRevision[com.example.foo:0.0.0]]
        at org.apache.felix.resolver.ResolverImpl.checkPackageSpaceConsistency(ResolverImpl.java:1142)
        at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:197)
        at org.jboss.osgi.resolver.felix.StatelessResolver.resolve(StatelessResolver.java:56)
        at org.jboss.osgi.framework.internal.ResolverImpl.resolveAndApply(ResolverImpl.java:137)
        at org.jboss.as.osgi.service.BundleLifecycleIntegration$BundleLifecycleImpl.activateDeferredPhase(BundleLifecycleIntegration.java:296)
        ... 31 more

Tam tezahürler:

app.jar/META-INF/MANIFEST.MF
----------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.app
Import-Package: com.example.foo.fragment,com.example.bar
----------------------------
foo.jar/META-INF/MANIFEST.MF
----------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.foo
Export-Package: com.example.foo;uses:="com.example.foo.cfg"
-------------------------------------
foo.fragment.jar/META-INF/MANIFEST.MF
-------------------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.foo.fragment
Fragment-Host: com.example.foo
Export-Package: com.example.foo.fragment,com.example.foo.cfg;uses:="co
 m.example.foo.fragment"
----------------------------
bar.jar/META-INF/MANIFEST.MF
----------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.bar
Export-Package: com.example.bar;uses:="com.example.foo"
Import-Package: com.example.foo

Bağımsız Apache Felix 4.2.1'de yukarıdaki hatayı yeniden üretemedim.

Bu davranışın nedeni nedir? Manifest'ten Fragment-Host: com.example.foosatırı silersem, hatasız bir foo.fragmentşekilde yeniden yükleyebilirim app. Bu JBoss AS 7.2'de bir hata mı?


1
Bunun oldukça garip olduğunu kabul ediyorum. Ben bunu JBoss AS framework uygulamasında bir hata olarak adlandırıyorum, bu durumda JBoss posta listesinde ve / veya sorun izleyicide rapor edilmelidir.
Neil Bartlett

Onunla biraz maymunlaştıktan sonra, bunun sadece uygulamanız JBoss başladığında devreye alınmadığında ortaya çıktığını fark ettim. Sonuçta, başka bir paket dışa aktarma org.hibernate.annotationsolabilir ve OSGi platformu, OSGi platformu uygulamam olmadan başlarsa, Spring ORM paketinin bağımlılığı olarak bunu çözer. Daha sonra uygulamamı dağıtıyorum ve OSGi org.hibernate.annotations, Spring ORM paketine çözümlenen paketle uyumlu olmadığı için sorunu çözemiyor . Kulağa mantıklı geliyor mu?
Emil Lundberg

4
Şimdi JBoss topluluğunda bir tartışma başlattım: community.jboss.org/thread/229824
Emil Lundberg

@NeilBartlett Sadece soru 2'nin cevabını anladım: paket dışa aktarma org.hibernate.annotationsbir parça Fragment-Host: com.springsource.org.hibernate.
Emil Lundberg

1
Bu bir hata gibi görünüyor. Parça demetlerinin, ana bilgisayar paketlerinin bir parçasıymış gibi davranmaları gerekir.
jgibson

Yanıtlar:


1

Eğer bağımlılık foo çözecek app foo.fragment almak zorunda değilsiniz. bu bağımlılığı kaldırın ve yeniden konuşlandırın. Bu sorun döngüsel bağımlılıktan kaynaklanmaktadır.


3
Bu döngüsel bir bağımlılık değildir . Foo.fragment uygulamasına bağlıysa döngüsel olurdu. Ancak, uygulama foo.fragment bağlıdır, bu yüzden hiçbir döngü yoktur. Bununla birlikte, uygulamadan foo.fragment'e açık bağımlılık gereksiz olabilir, bu doğru.
vog
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.