簡體   English   中英

使用Shiro時如何在OSGI E4環境中加載類?

[英]How to load Class in an OSGI E4 Environment while using Shiro?

我正在嘗試使用E4和他的OSGi(Equinox)環境來構建桌面應用程序。 對於我的使用Shiro的用戶安全性。 但是我可以從我的OSGi加載類,但是shiro不能!

在我的捆綁包中,我嘗試這樣:

InitActivator.java:

public class InitActivator implements BundleActivator {
private static BundleContext context;

static BundleContext getContext() {
    return context;
}

@Override
public void start(BundleContext context) throws Exception {

    //1. OSGi loadClass function
    System.err.println(context.getBundle().loadClass("com.firm.demo.MyCustomClass")
                    .getName());
    //2. Using Apache Shiro ClassUtils
    System.err.println("Shiro : " + ClassUtils.forName("com.firm.demo.MyCustomClass"));

    }

 }

1. system.err使用正確的名稱返回正確的類。 2. system.err返回一個org.apache.shiro.util.UnknownClassException:無法加載名為

如何在OSGi中使用Shiro來查找具有名稱的類?

如果查看ClassUtils的源代碼,您將看到它如何嘗試加載類: http ://grepcode.com/file/repo1.maven.org/maven2/org.apache.shiro/shiro-core/1.0 。 0-溫育/組織/阿帕奇/四郎/ util的/ ClassUtils.java#ClassUtils.forName%28java.lang.String%29

它嘗試的第一件事是借助附加到線程的ClassLoader加載類。 如果失敗,它將嘗試使用已加載ClassUtils的ClassLoader進行加載。 如果失敗,它將嘗試使用系統ClassLoader加載類。

您可以欺騙第一個,線程上下文類加載器。 我必須提到,這只是一種解決方法,而不是OSGi世界中不錯的解決方案:

BundleWiring bundleWiring = context.getBundle().adapt(BundleWiring.class);
ClassLoader bundleClassLoader = bundleWiring.getClassLoader();
Thread currentThread = Thread.currentThread();

ClassLoader originalCl = currentThread.getContextClassLoader()
currentThread.setContectClassLoader(bundleClassLoader);
try {
    System.err.println("Shiro : " + ClassUtils.forName("com.firm.demo.MyCustomClass"));
} finally {
    currentThread.setContextClassLoader(originalCl);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM