私はこの問題に苦労してきました: 注釈プロセッサ (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