Java 如何使用Eclipse从同一代码自动构建不同的JAR? 我在项目中有更多的课程,但现在只考虑A、B和C类。 abstract public class A {...} public class B extends A {...} public class C extends A {...}

Java 如何使用Eclipse从同一代码自动构建不同的JAR? 我在项目中有更多的课程,但现在只考虑A、B和C类。 abstract public class A {...} public class B extends A {...} public class C extends A {...},java,eclipse,maven,inheritance,ant,Java,Eclipse,Maven,Inheritance,Ant,然后我有一个代码,比如在D类中,像这样 A a = new B(); //A a = new C(); //use a's methods 因此,我现在的问题是如何在Eclipse构建中轻松配置两个独立的jar。第一个jar应该包含B.class和C.class并作为A=new B()编码第二个应包含C.class和B.class并将代码作为A=new C() 我对Ant和Maven了解不多。我需要在这种情况下使用它们吗 也许,我的设计有问题,如果有,请告诉我。在eclipse中,如果右键单

然后我有一个代码,比如在D类中,像这样

A a = new B();
//A a = new C();

//use a's methods
因此,我现在的问题是如何在Eclipse构建中轻松配置两个独立的jar。第一个jar应该包含
B.class
C.class
并作为
A=new B()编码第二个应包含
C.class
B.class
并将代码作为
A=new C()

我对Ant和Maven了解不多。我需要在这种情况下使用它们吗


也许,我的设计有问题,如果有,请告诉我。

在eclipse中,如果右键单击项目,您将有一个选项
导出
单击它,选择jar,然后命名jar,选择您想要的类。 对另一个罐子重复这个步骤


选中此复选框,您想要解决的主要是代码加载问题,而不是Ant问题

仅介绍创建新类实例时使用的两条语句:

A a = new B(); 
A a = new C();
构造函数是使用静态代码调用的。Ant无法更改代码,因此我看到的使用Ant的唯一方法是在构建过程中使用Ant生成工厂类,这取决于JAR中是否包含
a
C

但这将导致一个项目不能再直接在Eclipse中使用,因为Eclipse项目中的原始源代码丢失了factor类

更好的方法是动态类加载(可以与反射相结合)。您可以自动搜索扩展
A
的类,或者向JAR添加配置文件/info,指定要创建的类(例如属性文件)。 将属性文件与Java文件一起放在src文件夹中,并通过
this.getClass().getResource(“myclass.config”)加载它

配置文件可以包含用于创建新实例的类名。 以下截取的代码假定
B
C
都有一个不带任何参数的公共构造函数:

String classNameToLoad = ... // loaded from config file example "mypackage.B"
final Class<?> c = Class.forName(classNameToLoad);
final Class<? extends A> ac = c.asSubclass(A.class);
final Constructor<? extends A> a_ctor =  ac.getConstructor();
final A a = a_ctor.newInstance();
String classNameToLoad=…//从配置文件示例“mypackage.B”加载
最终c类=Class.forName(classNameToLoad);

最后一个类实现这一点的最简单方法是在Eclipse中有3个独立的Java项目。根据你的例子,那将是

  • B代码项目
  • C代码项目
  • 通用代码
Eclipse允许您在构建路径中引用项目中另一个项目的bin目录


然后可以将B和C项目作为单独的项目导出(或使用Ant)

我想说你需要一个
ant
任务。@SJuan76,代码如何
aaa=newb/C()?我确实忽略了这一点。我想说你应该使用CDI,但这意味着你的程序会发生变化。@SJuan76,这种情况不是很常见吗?欢迎您发布关于CDI使用的答案。顺便说一句,这是一个模棱两可的问题。CDI是一个有很多选择的复杂主题。要使其简单和肮脏,请在.properties文件中输入要使用的类的名称(
ant
可以这样做),以实例化读取该文件的类,并使用反射创建实例。我希望自动执行此操作。我使用Export-Executable Jar,因为类没有选择。你看到你的项目了吗?打开它,在左边选择一个“+”,然后转到构建路径,选择你的类请检查步骤的引用在Eclipse导出中有两个选项“Jar”和
Executable Jar
。我使用第二个,在那里你不能选择类。另外,如果您需要自动地手动加载,那么将非常繁琐。如果我采用动态类加载的方法,您将需要ANT,因为Eclipse和Jar可以使用相同的代码吗?是的,因为代码本身根据配置文件决定加载哪个类在Eclipse中也可以工作。只有MANIFEST.MF中的配置将不起作用,因为类文件不在JAR文件中。另请参阅我的更新答案。我在动态类加载和反射方面非常差。你能用更多的代码、说明或相关材料在答案中详细说明一下吗?因此,我会接受你的答案,因为这是迄今为止最好的答案。谢谢