即使ClassLoader.getResource找到.properties文件,也无法加载属性

时间:2013-01-07 22:56:00

标签: eclipse properties annotations velocity processor

我一直在努力解决这个问题: 我正在尝试编写一个注释处理器(使用Eclipse IDE) 1 - 识别注释并处理它 - 写入发现注释的消息 2 - 使用速度模板引擎生成新的源文件

(使用本教程:http://deors.wordpress.com/2011/10/31/annotation-generators/

我将它导出到.jar并与另一个客户端类一起使用。第1步是成功的,但是当解决第2步时,我无法超越这些界限:

Properties props = new Properties();  
URL url = this.getClass().getClassLoader().getResource("velocity.properties");
messager.printMessage(Diagnostic.Kind.NOTE, url.toString());  
props.load(url.openStream());  
messager.printMessage(Diagnostic.Kind.NOTE,"Properties loaded.");

url.toString()工作正常,它找到了“velocity.properties”:

罐子:文件:/ C:/Users/Zuz/workspace/Procesor_B/zh.procesor.b.jar /velocity.properties

但是第二条消息(“已加载属性”)从未出现过。在那之后也没有任何东西。没有生成文件。

我认为一定有问题

props.load(url.openStream());

我在客户端类中有三个注释,当我处理它们时,它是这样的:
找到第一个注释 - 找到velocity.properties - 从props.load(url.openStream())跳到循环结束。
创建第二个注释 - 相同的重复 创建第3个注释 - 相同的重复。

编辑:这是我得到的例外:

JAR entry velocity.properties not found in C:\Users\Zuz\workspace\Procesor_B\zh.procesor.b.jar  
java.io.FileNotFoundException: JAR entry velocity.properties not found in C:\Users\Zuz\workspace\Procesor_B\zh.procesor.b.jar

我也试过这个:

props.load(this.getClass().getClassLoader().getResourceAsStream("velocity.properties"));  

但我得到了:     java.lang.NullPointerException

您将在下面找到有关处理器和客户端类的更多信息。在此先感谢您的帮助!

这是我的注释处理器的源代码 - 现在没有做任何有用的事情:

    package zh.procesor.b;    

all necessary java, javax imports ommitted for length
import org.apache.log4j.Logger;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ResourceNotFoundException;

import zh.anotacia.b.Anotacia_B;

@SupportedAnnotationTypes("zh.anotacia.b.Anotacia_B")
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class Procesor_B extends AbstractProcessor{

private static final Logger LOG =
        Logger.getLogger(Procesor_B.class.getName());

private Filer file; 
private Messager messager;


@Override
public void init(ProcessingEnvironment env){    
    file = env.getFiler();
    messager = env.getMessager();

}

@Override
public boolean process(Set<? extends TypeElement> annotations,
        RoundEnvironment roundEnv)  {
    String className = "Trieda"; 
    String packageName = "Package";
    int i = 1; 

    for (Element elem: roundEnv.getElementsAnnotatedWith(Anotacia_B.class)){
        i++;
        Anotacia_B anot = elem.getAnnotation(Anotacia_B.class);
        String message = "Annotation found in : " + elem.getSimpleName();
        messager.printMessage(Diagnostic.Kind.NOTE, message);

        try{
        Properties props = new Properties();
        URL url = this.getClass().getClassLoader()
                .getResource("velocity.properties");

        messager.printMessage(Diagnostic.Kind.NOTE, url.toString());

        //from here it is not working
        props.load(url.openStream());
        messager.printMessage(Diagnostic.Kind.NOTE, "Properties loaded.");

        VelocityEngine ve = new VelocityEngine(props);
        ve.init(); 

        VelocityContext vc = new VelocityContext();
        vc.put("className", className+i);
        vc.put("packageName", packageName+i);

        Template vt = ve.getTemplate("testtemplate.vm");

        JavaFileObject jfo = file.createSourceFile(
                packageName + "." + className + "Info");

        messager.printMessage(
                Diagnostic.Kind.NOTE,
                "creating source file: " + jfo.toUri());

        Writer writer = jfo.openWriter();

        messager.printMessage(
                Diagnostic.Kind.NOTE,
                "applying velocity template: " + vt.getName());

        vt.merge(vc, writer);

        writer.close();

        } catch (Exception ex) {
            messager.printMessage(Diagnostic.Kind.ERROR, ex.getMessage());
            messager.printMessage(Diagnostic.Kind.ERROR,
                                  "Stacktrace: " + ex.toString());  
            messager.printMessage(Diagnostic.Kind.ERROR,  
                                  ex.getStackTrace().toString());
        }
    }         
    return true;
  }
}

以下是客户端类:

    package zh.trieda.b;  

import zh.anotacia.b.Anotacia_B;

@Anotacia_B(vstup = "50", vystup = "50")
public class Rad {  

@Anotacia_B(vstup = "10", vystup = "15")
public void basic(){
    // do something
    }  

@Anotacia_B(vstup = "2", vystup = "30")
public void premium(){
    // do something
    }
}  

我是新来的,所以我不允许放图片,但这里有一张图片链接 Procesor_B结构,客户端类Trieda_B结构,Trieda_B的工厂路径

http://bkmbj.wz.cz/structures.jpg

这是velocity.properties中的内容:

runtime.log.logsystem.class = org.apache.velocity.runtime.log.SystemLogChute
resource.loader = classpath
classpath.resource.loader.class =     org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

1 个答案:

答案 0 :(得分:0)

props.load(this.getClass().getClassLoader().getResourceAsStream("velocity.prope‌​rties");

应该有效。