IntelliJ IDEA-反编译/编辑/重新编译JAR

时间:2019-01-11 16:30:36

标签: java intellij-idea jar executable-jar

我意识到这似乎是一个完全愚蠢的问题,并且这个问题是“文字墙”,但是我感觉我已经超出了我的理解范围,需要一些指导。我已经阅读了有关此主题的一些SO问题,但似乎仍然找不到能够解决这种特殊情况的问题。 (请在此博文末尾提供参考更新


背景

我们公司的应用程序是用Java内置的,并由几年前去世的开发人员作为可执行JAR软件包发布。从那时起,几乎不需要查看该代码,更不用说进行任何更改了。那真的很好,因为我在VB.NET(Visual Studio)中进行编程,并且尽管我可以阅读和理解Java代码,但我并不擅长实际编写/调试该代码。

但是,由于组织和数据结构的某些内部更改,最近出现了一个问题,迫使我尝试查看此Java代码。我查看了他的“ src\”目录,找到了他原始代码的旧版本,但是在任何地方都找不到最新版本。我找到了一些代码,使我可以将当​​前正在使用的JAR提取到CodeProject(JarsVB)上的本地目录中,因此我能够查看一些.java文件当试图找出正在对某些随机操作使用哪个查询时。我不知道原始开发人员用来创建项目/ JAR的工具是什么,所以我已经安装了 IntelliJ IDEA Community Edition 2018 作为IDE,到目前为止,它已经为我工作了只是查看代码,这样我就可以了解它的功能。


问题/目标

不幸的是,现在我需要更改Java代码并更新JAR,这似乎使我无法做我想做的事情。我从“解压缩”的JAR中获得了代码的本地副本,其中包含所有.java.class文件(以及所有其他资源),但是我不确定如何从中转到修改代码并重新编译可执行的JAR。

所以,我的目标如下:

  1. (正确)反编译现有的可执行JAR。 (如果我上面提到的 JarsVB 解决方案做到了应有的作用,那么我应该已经处理了这部分,但是如果有更好,更“集成”的方法,我会也将对此保持开放。
  2. 修改一个或多个.java文件。 (我相信我可以弄清楚语法,足以完成这一部分。
  3. 调试/测试我的更改。
  4. 将更改重新编译为更新的可执行JAR以供发布。 ( 是我最困惑的地方。

我做了什么

我一直在寻找IntelliJ的文档,以试图弄清楚如何做到这一切,但是我感觉好像缺少了一些东西。我将“项目结构”设置设置为指向特定文件夹,但似乎无法在指定的路径中实际构建任何内容。

Project Structure -> Project Settings -> Project

Project Structure -> Project Settings -> Modules

我进入了.java文件之一,进行了一个小改动/保存进行测试,然后进入 Build 菜单并尝试了所有可用的构建选项:项目”,“构建模块”和“重建项目”。每次,事件日志都会显示“所有文件都是最新的”(即使我更改了一个文件),因此我转到输出目录以查看其内容,但是文件夹为空。

我查看了 Packaging a Module into a JAR File 的IntelliJ文档,该文档表示

  

在主菜单上,选择 Build |。 构建工件

但是在我的 Build 菜单中该选项被禁用,当我在 Project Structure 对话框中查看时,工件部分为空,因此我尝试添加新设置(添加-> JAR -> 来自具有依赖性的模块... ),但我没有确定如何正确设置它。

Add -> JAR -> From modules with dependencies...

我尝试从我的classes/目录中选择一个 Main Class ,但实际上它不接受我选择的任何.class文件,因此我只保留了它空白。然后,我搜索了MANIFEST文件,但是找不到任何文件,因此我也将其留为空白。现在已启用 Build 菜单选项,但是当我尝试 Build Artifact 时,再次在输出目录中没有任何内容。实际上,我可以找到的仅有更改的文件位于我的本地工作目录中。这时我很傻。


最后的想法/问题

在这里,我尝试提供尽可能多的细节,以尽可能地了解我为更新此JAR而进行的所有尝试,但是如果有任何疑问,请告诉我。我不是在寻找“讲义”,也不希望有人为我做这件事,但是我也不想成为Java开发人员,只是为了对应用程序进行一些小的更改,最终替换为.NET应用程序。我只是对这些工具或Java开发不够全面,以至于不知道如何从自己所在的位置到达自己想要的位置。

我反编译的源文件与原始的生产JAR文件位于一个完全独立的目录中,因为当我这次重新编译时,我想完全重新创建JAR。在编辑通过 JarsVB 反编译获得的.java文件之一然后重新编译JAR时,我是否正确理解Java开发过程?

在为实现这些目标所需的资源方面,我们先感谢您的协助。


编辑/更新

因此,在另一个SO问题How to build jars from IntelliJ properly?中,查看接受的答案中的链接,我发现问题的至少一部分:离开了 Main Class 设置, strong>工件配置为空白。由于我无法选择.class文件,而且不确定如何正确填充该字段,因此我没有为IDE提供足够的信息以使其正常运行。我输入了在类文件中找到的名称空间和类(namespace.class),该文件显然为应用程序定义了main方法,然后将MANIFISET.MF文件的路径设置为我的输出目录,并再次尝试构建工件

这次,至少,它 DID 在我定义的输出目录中生成了一个JAR,但大小仅为1KB。如上所述,源文件与从其进行反编译的原始JAR文件位于一个完全独立的目录中。输出目录也与原始JAR文件的位置完全分开。在输出路径中是否需要原始JAR文件的副本才能重新编译才能正常工作?

我正在取得进步,但是我可以肯定的是,我忽略了一些“愚蠢”的事情,这主要是由于我对IDE的不熟悉以及总体上对Java应用程序的开发。

更新2

看看另一个SO问题-how to create jar of java package in intelliJ idea-我了解到必须分别添加必要的文件才能重新打包到JAR中。但是,这带来了一个问题,我要添加哪些文件?链接的问题标识了.class文件,但是当我查看工作目录中的.class文件时,这些文件最近都没有更新,因此看起来我仍然在某个地方缺少步骤

这带来的另一个问题是,在准备环境时是否需要了解某些Java开发约定?我将输出路径设置为与任何工作或生产代码完全不同的文件夹,因此我想知道该设置中是否有可能引起问题。

正如我之前所说,我对.java文件之一进行了少量更改,然后尝试了 Build Module Rebuild Project 选项,但是这些仍然告诉我“所有文件都是最新的”。即使如此,我还是尝试将.class目录下的classes\文件添加到我的 Artifact 配置中,然后再次尝试 Build Artifact 。我有一个更大的文件(大约5MB),但是当我尝试执行JAR时,它似乎无能为力,更不用说实际启动该应用程序了。

我再次尝试通过添加源本地副本的根文件夹,并添加了根文件夹包含的所有内容。 (是的,该目录可能需要进行“春季大扫除”,但这是另一天的事情了)

All files/folders added to Artifact configuration

这次,我这次有一个更大的文件(大约21MB),所以我想我可能已经解决了这个问题。不幸的是,没有这样的运气。 JAR似乎仍然没有执行。

作为参考,从中反编译代码的原始JAR文件大约为。大小为59MB,因此IntelliJ在压缩方面做得非常出色,或者还有我还没有发现的另一步骤。我敢肯定,这是正确配置我的IDE的全部,但是我似乎找不到正确的设置组合。

0 个答案:

没有答案
相关问题