如何在Java应用程序中导入重复的包结构和类

如何在Java应用程序中导入重复的包结构和类,java,packages,Java,Packages,我想知道是否有办法在不改变包结构的情况下解决这个问题 我有两个类似的web应用程序,它们具有相同的包结构。类的名称也相同 我想使用这两个版本的软件包,并从第三个应用程序中的类创建对象 举个例子,原因是我想创建一个web应用程序来管理这两个其他web应用程序的用户帐户。两者的包结构都是com/mycompany/User.java 问题是(在我看来)我不能在我的类路径中只包含这两个应用程序包结构,并且在创建对象时有办法区分它们 i、 e 创建用户对象时,如何指定要从包1或包2创建它。我不想重构代码

我想知道是否有办法在不改变包结构的情况下解决这个问题

我有两个类似的web应用程序,它们具有相同的包结构。类的名称也相同

我想使用这两个版本的软件包,并从第三个应用程序中的类创建对象

举个例子,原因是我想创建一个web应用程序来管理这两个其他web应用程序的用户帐户。两者的包结构都是
com/mycompany/User.java

问题是(在我看来)我不能在我的类路径中只包含这两个应用程序包结构,并且在创建对象时有办法区分它们

i、 e


创建
用户
对象时,如何指定要从包1或包2创建它。我不想重构代码或改变应用程序包的结构方式。

你不能这样做,在java中,一个类由他的包和他的名字标识,你不能在同一个包中有两个同名的类

事实上,这确实是一个非常糟糕的做法,为什么你有两个名称完全相同的东西代表两个不同的东西?。更改您的包,至少在名称中包含应用程序名称:

com/mycompany/myapplication/User.java

您不能这样做,在java中,一个类由它的包和名称标识,您不能在同一个包中有两个同名的类

事实上,这确实是一个非常糟糕的做法,为什么你有两个名称完全相同的东西代表两个不同的东西?。更改您的包,至少在名称中包含应用程序名称:

com/mycompany/myapplication/User.java

您不能以任何推荐的方式执行此操作。
您应该重构它。

如果没有机会进行重构,例如出于法律原因,那么尝试以下方法:

虽然我不推荐使用它,但您可以使用
Proguard
仅混淆类用户,并使用预定义的
obfuscation.map
将其命名为User2。 输出是一个新的jar文件,其中类用户有一个新名称

此类obfuscation.map条目的示例:

com.company.transform.TransformException -> ad.d:

您不能以任何推荐的方式执行此操作。
您应该重构它。

如果没有机会进行重构,例如出于法律原因,那么尝试以下方法:

虽然我不推荐使用它,但您可以使用
Proguard
仅混淆类用户,并使用预定义的
obfuscation.map
将其命名为User2。 输出是一个新的jar文件,其中类用户有一个新名称

此类obfuscation.map条目的示例:

com.company.transform.TransformException -> ad.d:

您可以使用2个类加载器从不同的.jar文件加载(对于复杂的解决方案,请查看)。但是这会非常混乱,我建议重命名/重新打包。

您可以使用两个类加载器从不同的.jar文件加载(对于复杂的解决方案,请检查)。但这会非常混乱,我建议重命名/重新打包。

您可以使用多个类加载器来解决此问题,但我不建议这样做。@BrianRoach,是的,我重新制定并给出了解决方案。您可以使用多个类加载器来解决此问题,但我不推荐。@BrianRoach,是的,我重新制定并给出了一个解决方案。您可以使用多个类加载器来解决这个问题,但我不推荐使用它。@Brian Roach您能详细介绍一下您的评论并给出答案吗?“如果只是为了一个暂时的解决方案,这将是非常有帮助的。”马修说实话,不。因为这将是一个糟糕的答案。正确的答案是正确地重构源代码。@我认为使用类加载器可以帮助我解决问题,但不确定从哪里开始。我很欣赏这个“正确”的答案,但这并不是我想要的答案。是的,我有点固执,但如果没有人能提供解决办法,我会接受这个。你可以使用多个类加载器来解决这个问题,但我不推荐。@Brian Roach你能详细介绍一下你的评论并给出答案吗?“如果只是为了一个暂时的解决方案,这将是非常有帮助的。”马修说实话,不。因为这将是一个糟糕的答案。正确的答案是正确地重构源代码。@我认为使用类加载器可以帮助我解决问题,但不确定从哪里开始。我很欣赏这个“正确”的答案,但这并不是我想要的答案。是的,我有点固执,但如果没有人能提供解决办法,我会接受这个。