我正在使用Salesforce SOAP API开展项目。我需要在项目中为不同的Salesforce实例使用来自不同SOAP API jar的java类,但类名和它们的包名完全相同。
例如:
jar的Salesforce实例 A 有 com.sforce.soap.enterprise.sobject.SObject.Opportunity ,它有一个名为 attrA的自定义属性
jar的Salesforce实例 B 有 com.sforce.soap.enterprise.sobject.SObject.Opportunity ,它有一个名为 attrB的自定义属性
Maven结构:
如何在单个项目中同时使用 attrA 和 attrB ?换句话说,如何分别识别具有相同包名和类名的不同类?
我是否必须将我的项目拆分为两个子项目才能同时使用这两个子项目?
答案 0 :(得分:2)
你不能用Java做到这一点。包名称+类名称对于项目必须是唯一的。
您可能需要重构项目,以便不同的Salesforce JAR位于他们自己的项目中,并且只向主项目公开必要的接口。唯一的另一种选择是编写自定义类加载器,但这很复杂。
请参阅package documentation here:
开发人员应该采取措施,通过为广泛分发的软件包选择唯一的软件包名称来避免两个已发布的软件包具有相同名称的可能性。这样可以轻松自动地安装和编目包。本节指定用于生成此类唯一包名称的建议约定。鼓励Java平台的实现提供自动支持,以便将一组包从本地和临时包名转换为此处描述的唯一名称格式。
如果未使用唯一的包名称,那么包名称冲突可能远远超出任何冲突包的创建点。这可能会造成用户或程序员难以或不可能解决的情况。在包有约束交互的情况下,类ClassLoader可用于隔离具有相同名称的包,但不能以对初始程序透明的方式隔离。