Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据版本筛选出Java方法?_Java_Jar_Executable Jar - Fatal编程技术网

如何根据版本筛选出Java方法?

如何根据版本筛选出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

我需要生成三个不同版本的jar库。类的某些方法用注释进行标记,这些注释指定添加这些方法时的版本。例如:

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个。这说明了这一点。我想我真的需要尝试一下,但看起来它可以工作。谢谢