我想将一个小型 Java 应用程序作为可运行的 jar 移交,但我不希望任何人访问我的源代码。我是否正确地假设 jar 文件中不包含源代码(.java 文件)?
用户269799
我想将一个小型 Java 应用程序作为可运行的 jar 移交,但我不希望任何人访问我的源代码。我是否正确地假设 jar 文件中不包含源代码(.java 文件)?
用户269799
Jar 文件通常只包含 .class 文件,即 java 字节码文件以及资源。但是,为了让您的代码更加安全,您需要关闭调试信息,如果您真的想要安全,请通过混淆器运行它。
编辑:berry120 的评论是正确的——它们可以包含源文件,但通常它们不包含。我只是想为未来的读者澄清一下。这取决于您用于生成 jar 的工具的设置。
假设您没有将java 文件放入 jar 文件中,它们不会神奇地出现:) 当然,您可以在 jar 文件中包含任何您喜欢的内容。您可以列出要检查的内容:
jar tvf foo.jar
请注意,Java 可以很容易地被反编译 - 因此,尽管任何接收者都无法访问带有注释等的实际源代码,但他们可以非常清楚地看到您的逻辑。您可能希望使用混淆器来帮助保护您的 IP。就我个人而言,我尽量避免混淆器 - 考虑到当我们确实拥有带有评论和测试的真实来源时,我们大多数人发现维护代码是多么困难,想象一下当你没有这些东西时有多难 :) 这是你的电话。只要确保彻底测试混淆代码 - 可能会出现微妙的问题,特别是如果您使用反射。
如果计算机可以运行它,那么人类可以对其进行逆向工程,这对 Java 来说并不是特别难。
所以技术保护根本行不通。您需要具有约束力的合同或类似形式的法律保护。您甚至可以将您的作品置于 GPL 之下,除了那些付钱给您的作品,这足以让大多数企业避免窃取您的作品。
你究竟想避免什么情况?
没错,jar 中没有源代码(除非您将构建系统配置为专门将其放入其中)。但是您始终面临代码从字节码中反编译的风险。混淆器可能会在这里有所帮助。
是的。通常,jar 只包含字节编译的 .class 文件。也就是说,它们也可以包含源代码——这取决于你(或你的工具,分别)放入其中的内容。
但是请注意,反编译在 .class 文件上工作得很好,所以不要让任何与安全相关的东西依赖于代码混淆技术,比如这个。
通常没有,但您可以使用jar -tvf <filename>
命令来检查它。
.class
但是我必须警告你,将大多数文件反编译成可读性强的 java 源代码是非常容易的。
为避免这种情况,您必须使用混淆器,但这需要您付出额外的努力。(例如RetroGuard。)
话虽如此,问自己一个问题:“我的代码真的那么有价值或特别吗?我需要做这一切吗?” 通常答案是否定的,我们写的大部分代码都没什么特别的。
你是对的,但是 .class 文件可以很容易地反汇编为 java 代码,并且在大多数情况下它非常准确。
如果你真的需要它来保证安全,那么你需要进行混淆处理。
这将取决于您生成该 .jar 的方式,Eclipse 确实可以选择在 .jar 中包含 .java 文件,但默认情况下它是禁用的,如果需要,您必须激活它。
Jar 文件可能包含源代码(您可以选择是否包含它),因此不特别包含源代码不是问题。您需要注意的是,人们可能会对 jar 文件中的类文件进行逆向工程。
您可以使用诸如 yGuard 之类的混淆器来解决这个问题,它可以轻松地作为 ant 任务挂接,但正如其他人所说,您的代码真的那么重要以至于没有人看到它吗?
.jar 文件不包含源代码,仅包含字节码 (.class)。但是由于字节码是独立于机器的,它可以很容易地被反编译。没有办法阻止其他人访问您的源代码。