提示没有使用Java无法工作_java – 在Eclipse插件中使用时,Reflections库无法正常工作...

我假设您已经知道如何创建包(否则,请检查

this).

在对Reflections API进行了一些调查和探索之后,我意识到问题是Reflection只是无法读取OSGi URL(bundleresource:// …)导致异常:

org.reflections.ReflectionsException: could not create Vfs.Dir from url,

no matching UrlType was found [bundleresource://1009.fwk651584550/]

这个建议:

either use fromURL(final URL url, final List urlTypes)

or use the static setDefaultURLTypes(final List urlTypes)

or addDefaultURLTypes(UrlType urlType) with your specialized UrlType.

因此,我相信为OSGi实现UrlType(例如,类BundleUrlType实现UrlType {…})并将其注册为:

Vfs.addDefaultURLTypes(new BundleUrlType());

应该使束内的Reflections API可用.应该将反馈依赖项添加到Eclipse插件项目中,如here所述.

这是添加所需罐子后我的样品MANIFEST.MF的样子:

Manifest-Version: 1.0

Bundle-ManifestVersion: 2

Bundle-Name: ReflectivePlugin

Bundle-SymbolicName: ReflectivePlugin

Bundle-Version: 1.0.0.qualifier

Bundle-Activator: reflectiveplugin.Activator

Bundle-ActivationPolicy: lazy

Bundle-RequiredExecutionEnvironment: JavaSE-1.6

Import-Package: javax.annotation;version="1.0.0",

org.osgi.framework;version="1.3.0",

org.osgi.service.log;version="1.3",

org.osgi.util.tracker;version="1.3.1"

Bundle-ClassPath: .,

lib/dom4j-1.6.1.jar,

lib/guava-r08.jar,

lib/javassist-3.12.1.GA.jar,

lib/reflections-0.9.5.jar,

lib/slf4j-api-1.6.1.jar,

lib/xml-apis-1.0.b2.jar

Export-Package: reflectiveplugin,

reflectiveplugin.data

注意:使用Reflections v.9.5.5

以下是UrlType实现的示例:

package reflectiveplugin;

import java.io.IOException;

import java.io.InputStream;

import java.net.URL;

import java.util.Enumeration;

import java.util.Iterator;

import org.osgi.framework.Bundle;

import org.reflections.vfs.Vfs;

import org.reflections.vfs.Vfs.Dir;

import org.reflections.vfs.Vfs.File;

import org.reflections.vfs.Vfs.UrlType;

import com.google.common.collect.AbstractIterator;

public class BundleUrlType implements UrlType {

public static final String BUNDLE_PROTOCOL = "bundleresource";

private final Bundle bundle;

public BundleUrlType(Bundle bundle) {

this.bundle = bundle;

}

@Override

public boolean matches(URL url) {

return BUNDLE_PROTOCOL.equals(url.getProtocol());

}

@Override

public Dir createDir(URL url) {

return new BundleDir(bundle, url);

}

public class BundleDir implements Dir {

private String path;

private final Bundle bundle;

public BundleDir(Bundle bundle, URL url) {

this(bundle, url.getPath());

}

public BundleDir(Bundle bundle, String p) {

this.bundle = bundle;

this.path = p;

if (path.startsWith(BUNDLE_PROTOCOL + ":")) {

path = path.substring((BUNDLE_PROTOCOL + ":").length());

}

}

@Override

public String getPath() {

return path;

}

@Override

public Iterable getFiles() {

return new Iterable() {

public Iterator iterator() {

return new AbstractIterator() {

final Enumeration entries = bundle.findEntries(path, "*.class", true);

protected Vfs.File computeNext() {

return entries.hasMoreElements() ? new BundleFile(BundleDir.this, entries.nextElement()) : endOfData();

}

};

}

};

}

@Override

public void close() { }

}

public class BundleFile implements File {

private final BundleDir dir;

private final String name;

private final URL url;

public BundleFile(BundleDir dir, URL url) {

this.dir = dir;

this.url = url;

String path = url.getFile();

this.name = path.substring(path.lastIndexOf("/") + 1);

}

@Override

public String getName() {

return name;

}

@Override

public String getRelativePath() {

return getFullPath().substring(dir.getPath().length());

}

@Override

public String getFullPath() {

return url.getFile();

}

@Override

public InputStream openInputStream() throws IOException {

return url.openStream();

}

}

}

这就是我在Activator类中创建反射的方法:

private Reflections createReflections(Bundle bundle) {

Vfs.addDefaultURLTypes(new BundleUrlType(bundle));

Reflections reflections = new Reflections(new Object[] { "reflectiveplugin.data" });

return reflections;

}

最后一点非常令人困惑,但仍然很重要:如果你在Eclipse(Run As / OSGi Framework)中运行你的插件,你必须将你的类输出目录添加到Reflections路径模式(即“bin”或“target / classes” “).虽然,发布的插件不需要它(构建插件/包做“导出” – >“可部署的插件和片段”).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值