Eclipse Can';即使ClassLoader.getResource找到了.Properties文件,也不能加载属性

Eclipse Can';即使ClassLoader.getResource找到了.Properties文件,也不能加载属性,eclipse,properties,annotations,velocity,processor,Eclipse,Properties,Annotations,Velocity,Processor,我一直在努力解决这个问题: 我正在尝试编写一个注释处理器(使用EclipseIDE),它应该 1-识别批注并对其进行处理-写入找到批注的消息 2-使用velocity模板引擎生成新的源文件 (使用本教程:) 我将其导出到.jar并与另一个客户机类一起使用。步骤1成功,但解决步骤2时,我无法越过以下几行: Properties props = new Properties(); URL url = this.getClass().getClassLoader().getResource("ve

我一直在努力解决这个问题: 我正在尝试编写一个注释处理器(使用EclipseIDE),它应该
1-识别批注并对其进行处理-写入找到批注的消息
2-使用velocity模板引擎生成新的源文件

(使用本教程:)

我将其导出到.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”:

jar:file:/C:/Users/Zuz/workspace/Procesor\u B/zh.Procesor.B.jar/速度特性

但是第二条消息(“Properties loaded.”)从未出现。之后的任何事情都不起作用。没有生成任何文件。我想一定是出了什么问题

load(url.openStream())

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

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

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
    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
    }
}  
runtime.log.logsystem.class = org.apache.velocity.runtime.log.SystemLogChute
resource.loader = classpath
classpath.resource.loader.class =     org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
我也试过:

props.load(this.getClass().getClassLoader().getResourceAsStream("velocity.properties"));  
但我得到了:
java.lang.NullPointerException

下面您将找到关于处理器和客户端类的更多信息。提前感谢您的帮助

这是我为Annotation Processor编写的源代码-目前没有做任何有用的事情:

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
    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
    }
}  
runtime.log.logsystem.class = org.apache.velocity.runtime.log.SystemLogChute
resource.loader = classpath
classpath.resource.loader.class =     org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
我是新来的,所以不允许我放图片,但这里有一个链接,链接的是
Procesor_B结构,客户端类Trieda_B结构,Trieda_B的工厂路径

以下是velocity中的内容。属性:

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
    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
    }
}  
runtime.log.logsystem.class = org.apache.velocity.runtime.log.SystemLogChute
resource.loader = classpath
classpath.resource.loader.class =     org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

应该有用

props.load(this.getClass().getClassLoader().getResourceAsStream(“velocity.properties”);
应该可以工作。结果如何?异常?
ex.getMessage();ex.getStackTrace();
不打印异常,这些行没有任何用处。您可以打印它们以查看实际的异常吗?@MarcelStör@SergiuDumitriu
props.load(this.getClass().getClassLoader().getResourceAsStream(“velocity.prope‌​rties);
工作得很好!谢谢!但是,当尝试处理时,它仍然会跳过Velocity Engine init()中的执行代码'直到cyclus结束。我得到的异常是:
org.apache.velocity.Exception.VelocityException:'初始化日志时出错:无法使用当前运行时配置初始化org.apache.velocity.runtime.log.log4jlogslucte的实例。
有什么想法吗?@MarcelStör我无法接受答案,因为当我ed我再次开始得到NullpointerException(使用ResourceAsStream)或FileNotFound(使用getResource时)。我不知道为什么。其他一切都是一样的。