4

我想将一个小型 Java 应用程序作为可运行的 jar 移交,但我不希望任何人访问我的源代码。我是否正确地假设 jar 文件中不包含源代码(.java 文件)?

用户269799

4

10 回答 10

3

Jar 文件通常只包含 .class 文件,即 java 字节码文件以及资源。但是,为了让您的代码更加安全,您需要关闭调试信息,如果您真的想要安全,请通过混淆器运行它。

编辑:berry120 的评论是正确的——它们可以包含源文件,但通常它们不包含。我只是想为未来的读者澄清一下。这取决于您用于生成 jar 的工具的设置。

于 2011-01-27T22:47:46.547 回答
3

假设您没有java 文件放入 jar 文件中,它们不会神奇地出现:) 当然,您可以在 jar 文件中包含任何您喜欢的内容。您可以列出要检查的内容:

jar tvf foo.jar

请注意,Java 可以很容易地被反编译 - 因此,尽管任何接收者都无法访问带有注释等的实际源代码,但他们可以非常清楚地看到您的逻辑。您可能希望使用混淆器来帮助保护您的 IP。就我个人而言,我尽量避免混淆器 - 考虑到当我们确实拥有带有评论和测试的真实来源时,我们大多数人发现维护代码是多么困难,想象一下当你没有这些东西时有多难 :) 这是你的电话。只要确保彻底测试混淆代码 - 可能会出现微妙的问题,特别是如果您使用反射。

于 2011-01-27T22:47:46.750 回答
3

如果计算机可以运行它,那么人类可以对其进行逆向工程,这对 Java 来说并不是特别难。

所以技术保护根本行不通。您需要具有约束力的合同或类似形式的法律保护。您甚至可以将您的作品置于 GPL 之下,除了那些付钱给您的作品,这足以让大多数企业避免窃取您的作品。

你究竟想避免什么情况?

于 2011-01-27T23:22:34.747 回答
2

没错,jar 中没有源代码(除非您将构建系统配置为专门将其放入其中)。但是您始终面临代码从字节码中反编译的风险。混淆器可能会在这里有所帮助。

于 2011-01-27T22:48:23.393 回答
2

是的。通常,jar 只包含字节编译的 .class 文件。也就是说,它们也可以包含源代码——这取决于你(或你的工具,分别)放入其中的内容。

但是请注意,反编译在 .class 文件上工作得很好,所以不要让任何与安全相关的东西依赖于代码混淆技术,比如这个。

于 2011-01-27T22:49:33.940 回答
1

通常没有,但您可以使用jar -tvf <filename>命令来检查它。

.class但是我必须警告你,将大多数文件反编译成可读性强的 java 源代码是非常容易的。

为避免这种情况,您必须使用混淆器,但这需要您付出额外的努力。(例如RetroGuard。)

话虽如此,问自己一个问题:“我的代码真的那么有价值或特别吗?我需要做这一切吗?” 通常答案是否定的,我们写的大部分代码都没什么特别的。

于 2011-01-27T22:47:35.623 回答
1

你是对的,但是 .class 文件可以很容易地反汇编为 java 代码,并且在大多数情况下它非常准确。

如果你真的需要它来保证安全,那么你需要进行混淆处理。

于 2011-01-27T22:47:36.047 回答
1

这将取决于您生成该 .jar 的方式,Eclipse 确实可以选择在 .jar 中包含 .java 文件,但默认情况下它是禁用的,如果需要,您必须激活它。

于 2011-01-27T22:48:32.997 回答
1

Jar 文件可能包含源代码(您可以选择是否包含它),因此不特别包含源代码不是问题。您需要注意的是,人们可能会对 jar 文件中的类文件进行逆向工程。

您可以使用诸如 yGuard 之类的混淆器来解决这个问题,可以轻松地作为 ant 任务挂接,但正如其他人所说,您的代码真的那么重要以至于没有人看到它吗?

于 2011-01-27T23:09:59.903 回答
0

.jar 文件不包含源代码,仅包含字节码 (.class)。但是由于字节码是独立于机器的,它可以很容易地被反编译。没有办法阻止其他人访问您的源代码。

于 2011-01-27T22:47:55.517 回答