如何根据版本筛选出Java方法?
我需要生成三个不同版本的jar库。类的某些方法用注释进行标记,这些注释指定添加这些方法时的版本。例如:如何根据版本筛选出Java方法?,java,jar,executable-jar,Java,Jar,Executable Jar,我需要生成三个不同版本的jar库。类的某些方法用注释进行标记,这些注释指定添加这些方法时的版本。例如: public class A { @SinceVersion(2) public int getTotal() { // do something... } @SinceVersion(5) public int getMax() { // do something... } @SinceVersion(4) public int ge
public class A {
@SinceVersion(2)
public int getTotal() {
// do something...
}
@SinceVersion(5)
public int getMax() {
// do something...
}
@SinceVersion(4)
public int getAverage() {
// do something...
}
}
然后:
- 生成
时,只应包含my-library-2.jar
getTotal()
- 生成
时,只应包含my-library-4.jar
和getTotal()
getAverage()
- 当我生成
时,应该包括所有三种方法my-library-5.jar
这是一个简化的例子。真正的问题涉及300个类,10个版本,每个类有6个subversion。为什么不使用源代码管理(git等)来管理您的版本?当您用v2.0标记一个发行版时,到那时为止的代码将只有getTotal()。然后,v4.0将经历一段漫长的过程,到那时为止,代码将包含getTotal()和getAverage(),以此类推 每个版本都可以独立管理和构建,并为特定版本生成特定的jar文件
然后,您的客户机将包括它需要的jar的任何版本。您可能需要考虑实现注释处理器
注释处理器在编译时运行,用于创建和/或操作代码,我使用它们创建样板代码,以及手动维护繁琐但结构清晰的代码。我想发布我找到的解决方案,以防对其他人有所帮助 经过一周的研究,我终于找到了答案。这个库允许您检查和修改JVM中加载的类;修改后,它可以作为.class文件写入文件系统 这样一段代码将生成一个新的类文件,而不包含一些方法:
import org.apache.bcel.Repository;
import org.apache.bcel.classfile.AnnotationEntry;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.ClassGen;
JavaClass clazz = Repository.lookupClass("test.House");
ClassGen cg = new ClassGen(clazz);
Method m = findMethod(clazz, "close");
AnnotationEntry ae = m.getAnnotationEntries(); // process annotations here...
cg.removeMethod(m); // remove the method you want to remove
JavaClass modifiedClazz = cg.getJavaClass();
modifiedClazz.dump("./gen/test/House.class"); // save to a new file
通过遍历整个类树(或子包树),可以找到所有受影响的类,处理它们的方法,并在注释值符合某些条件时删除它们。理想情况下,您应该创建一个包含重复类的多版本JAR文件,其中一些类根据版本具有不同的方法。见:@JacobG。这将是最后的解决办法。我有60多个版本,而且还在增长。我需要复制所有课程60次。考虑到我目前有300门课,总共会产生18000门课。我不想维护18000个类。谢谢,但是这个项目已经有了源代码管理。问题是我需要根据客户端版本生成。。。这些数字可能高达60个。这说明了这一点。我想我真的需要尝试一下,但看起来它可以工作。谢谢