我有一个外部可执行 jar 文件,我希望使用 Eclipse 编辑其中的 java 文件
Posted
技术标签:
【中文标题】我有一个外部可执行 jar 文件,我希望使用 Eclipse 编辑其中的 java 文件【英文标题】:I have an external executable jar file that I wish to edit the java files in it with Eclipse 【发布时间】:2013-06-11 23:38:32 【问题描述】:但是当我将外部 jar 文件添加到项目时,它不会将 java 文件放在 src 中。我该怎么办?
【问题讨论】:
我认为您必须先提取 java 文件才能对其进行编辑。 jar文件有源码吗? 提取您的 jar 文件并检查它是否包含源文件。如果是这样,请将源代码 (.java) 添加到您的 eclipse src 目录中。然后你就可以进行修改和构建了。如果您打算对其进行修改,请不要将 jar 文件本身链接为外部库。 我已经提取了所有的源文件,但是有数百个文件。当我使用添加可执行 jar 文件选项打开它们时,这些文件位于引用的库文件夹下,并且都具有扩展名 .class 而不是 .java。 Jar 文件往往不包含源文件,它们往往只包含类文件(这不是硬性规定,但往往是正常状态)。您需要下载/查找用于构建 jar 的源文件 【参考方案1】:Jar 文件通常是您的 java 类的编译形式。源代码可以包含在 jar 中,但很少包含。因此,您将看到“.class”文件,而不是预期的“.java”文件,它们是代码的编译形式。如果你想编辑文件,你有几个选择
在别处寻找来源
这真的是你最好的选择。如果它是一个开源项目,请寻找它的来源。你可以很容易地用谷歌搜索它,或者在搜索引擎中搜索像 this one 这样的 maven 存储库。例如,如果您看到here,我查找了 junit,并找到了一个名为“sources.jar”的条目。 如果它不是开源项目,而是您工作的内部项目,则可能有一个团队负责该项目。与他们联系,因为获得最初编译的原始资源确实是您的最佳选择。
但是,如果您绝对无法访问源代码怎么办。那么,你有两个选择。如果您非常熟悉 Java,我只会推荐这些选项,因为它们可能会带来比它们解决的更多的麻烦。
扩展类和替换方法
我假设您想要这样做的原因是编辑其中一个类的一小部分行为,然后在您可以访问代码的项目中使用该更改的类;并且您要扩展的类不是final。在这种情况下,您可以扩展该类,创建一个 subclass,然后创建一个 override 控制您想要更改的小功能的方法。
现在,如果您对自己所做的事情不小心,这可能是一个非常危险的想法。原因是如果您无权访问代码,那么您无法确定实现细节是如何工作的。这可能会导致错误。对原始代码缺乏可见性可能导致
-
以破坏类的原始功能的方式覆盖方法。发生这种情况的原因可能是您覆盖的某个方法可能正在执行某些您可能不明显的内部操作。
原始类中可能存在non public or non protected 的字段和方法,您的新类可能无法访问这些字段和方法。因此,您可能无法将功能完全替换为所需的功能。
那么,如果这可能不是最好的主意的所有这些原因让您担心呢?还有另一种方法可以直接在类上替换功能。
反编译项目
有许多可用的 Java 反编译器可以将“.class”文件转换为“.java”文件some that even integrate with eclipse。但是,与获取原始来源相比,这具有严重的缺点
-
这可能不合法。如果您拥有的 jar 是由许可证提供的,那么您很可能会违反您在下载和使用该 jar 之前同意的许可协议。
代码不容易阅读。您将失去源代码中最初包含的大部分良好命名约定,从而使代码非常难以阅读。
反编译和重新编译很容易导致比其价值更多的错误。它完全可以很好地使用,但我建议你尽可能远离。
那么,你应该怎么做呢?
组合,无需重新实现
我猜你现在有一个 jar,它提供了一个类(或类列表),几乎可以满足你的需求,但并不完全如此。好吧,与其更改原始源(您似乎无权访问),不如使用该类,并创建一个方法将其最终组件更改为您想要的样子。您可以通过创建一个包含所需类作为字段的类并对其进行修改来做到这一点。例如,假设您的 jar 是一个名为 EuropeanCar 的类,并且您喜欢它,但希望拥有 AmericanCar,唯一的区别是美国汽车以“英里/小时”返回其当前速度,而不是欧洲汽车的“公里”每小时”。但在此示例中,所有其他功能都是 100% 相同的。
你可以有这样的东西:
public class AmericanCar
//...
private EuropeanCar internalEuropeanCar;
//...
public double getCurrentSpeed()
return AmericanCar.convertKilometerToMiles(this.internalEuropeanCar.getCurrentSpeed());
private static double convertKilometerToMiles(double currentSpeed)
// ...
return CONVESION_VALUES;
//...
当然这是一个过于简化的例子,但想法是使用components,这些组件可以是jar中提供的类型供您在程序中使用。如果您无法访问原始源代码,这是迄今为止解决问题的最干净的解决方案,即使您这样做,根据您想要进行的更改,它也可能是一个更好的选择。
【讨论】:
我最终找到了存储库并使用源代码控制系统检查了代码。以上是关于我有一个外部可执行 jar 文件,我希望使用 Eclipse 编辑其中的 java 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 sbt-assembly 来自单个项目的具有不同外部依赖项的多个可执行 jar 文件
pom文件配置打包外部/自定义jar文件在fat spring boot可执行jar文件中
如何将外部jar文件传递给spring boot项目? [复制]
Java Bean Validation 2.0 Hibernate Validator - 带有外部 XML 配置的可执行 JAR