0

私はこの問題に苦労してきました: 注釈プロセッサ (Eclipse IDE を使用) を作成しようとしてい ます
.

(このチュートリアルを使用: 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」が見つかったことを示しています。

jar:file:/C:/Users/Zuz/workspace/Procesor_B/zh.procesor.b.jar!/velocity.properties

しかし、2 番目のメッセージ ("Properties loaded.") は表示されません。その後は何も機能しません。ファイルは生成されません。何かが間違っていたに違いないと思います

props.load(url.openStream());

クライアント クラスに 3 つの注釈があり、それらを処理すると次のようになり
ます。
2 番目の注釈が見つかりました - 同じことが繰り返されます。
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

以下に、プロセッサとクライアント クラスの両方に関する詳細情報を示します。助けてくれてありがとう!

Annotation Processor のソース コードは次のとおりです。現在は何も役に立ちません。

    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 のファクトリー パスの 写真付きのリンクを 1 つ示します。

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
4

1 に答える 1

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

動作するはずです。

于 2013-01-11T07:25:02.117 に答える