GCJ(适用于Java的GNU编译器)是否是发布Web应用程序的可行工具?
使用GCJ发布服务器端应用程序真的可行吗?网络应用程序?
我的老板坚信将我们的Web应用程序编译为二进制可执行文件是一个绝妙的主意。 (再说一次,他喜欢带有闪烁的灯光的小巧简单的东西,他可以理解。)他本能地认为没有问题,而我只看到无尽的问题和退化。一旦我开始与他谈论我们平台的复杂性,以及字节码,JVM,库,操作系统之间的差异,处理器体系结构等的更深层次的细节……好吧……他的目光在眨眼,他已经明确表示他认为我是幼稚的抵抗者。
他为什么要一个魔术可执行文件?他看到了几个"好处":
- 如果它是二进制可执行文件,则很难进行逆向工程和规避任何许可。尽管我们出售给通常不使用服务器软件作弊的大型公司,但管理层始终担心这种情况的发生。
- 有下载此魔术可执行文件,运行它并一切正常的愿景。 (没有更多的人派我去做客户安装,这并不那么频繁。)
因此,我已经完成了20分钟的强制性谷歌搜索,现在我在这里。
我的应用程序有一些背景知识:
它是由什么制成的:
- Java 6(Sun的JVM)
- AspectJ 1.6
- 雄猫6
- 休眠3
- 春季2
- 另外两打支持的jar文件
它能做什么
- 流媒体CMS
- 性能敏感
- 部署在Linux,Solaris,Windows上(并在Mac上开发)
正如我们可能会收集到的那样,我对这种"将Java编译为本地代码"表示高度怀疑。听起来像Mono(Linux上的VB)在2000年时的状况。但是我是否过于悲观?可行吗?我是否应该实际花费时间(几天甚至几周)尝试一下?
还有一个类似的线程(用于生成.exe文件的Java编译器选项),但是它有点太简单了,链接已过时,并且并没有真正针对服务器端的问题。
亲爱的SOpedians,见解将十分珍贵! TIA!
解决方案
回答
FWIW:我从来没有对GCJ感到好运,我在使用它时遇到了很多问题,并且出现了一些晦涩难懂的问题,这些问题永远需要诊断给GCJ,而不是我(我一直非常非常不愿意将事情归咎于外部库)。我会公开承认这是几年前发生的,而且我再也不想再去GCJ了。为了提供更多的内容,这是在我上学的时候,当时我正在从事一个琐碎的程序,所以在"企业级别"上,我一直对GCJ充满恐惧。
回答
我认为像我们这样的大型应用程序不会编译为机器代码。请记住,java不仅是Java语法(可能会编译为机器代码),而且还是一个虚拟机,它更像是一个应用程序/进程环境。我建议制作一个uberjar或者类似的东西。
回答
我不知道GCJ,但我的公司成功使用Excelsior JET。我们还没有使用webapp做到这一点,但是它应该能够处理Sun JRE可以做到的一切。实际上,JET是Sun认证的Java实现。
回答
拥有一个可执行文件有一些缺点:
我们无法轻松地对其进行修补(即替换一个类文件),我认为它不能被称为Web应用程序-我认为它不会在Tomcat中运行。
它是非标准的,因此会增加维护成本。
它是非标准的,因此减少了对工具的支持。
如果他想要简单的东西,也许战争或者听觉会更好。我看不到这样做有什么好处-我认为这是有益的,因为它是我们分发的独立应用程序,因此人们可以双击它。
回答
也许老板只需要一个演示,以了解如何在自己的应用程序服务器上为客户分发和部署War文件是多么容易。每个文件都是"二进制文件",因此我们可能认为他在命令行上表示可执行文件,这可能太过直白了。
回答
我只是非常简短地使用了GCJ,然后迅速转到了Sun的JDK。我看到的主要问题是,GCJ似乎总是落后于最新版本的Sun JDK,并且由于与Sun JDK的细微差异而导致了一些奇怪的神秘错误。在1.5版(应该与Sun的v1.5兼容)中,我在使用泛型进行编译时遇到了问题,最后放弃了,转而使用Sun的JDK。
我必须说,性能上的任何差异都可以忽略不计(就我的目的而言,YMMV),实际上解决安装问题的方法是为应用创建安装程序。逆向工程二进制实际上并不比逆向工程字节码要难得多。如果那很重要,请使用混淆器。
总的来说,我认为使用GCJ所涉及的兼容性问题远远超过了可能从中获得的任何收益(我认为这最多是可疑的)。尝试在gcj中编译应用程序的各个部分,然后查看其运行情况。如果一切正常,否则我们会得到一些可靠的建议来向老板推销。
回答
尽管我对GCJ知之甚少,但我会扮演一些恶魔拥护者。
编译为本机代码可能会提高应用程序的性能,并使用较少的内存,因此,如果可以使其正常运行,则在竞争方面对企业来说是有利的。
能够更好地支持应用程序对企业也有好处。
因此,值得一提的是,应该考虑到没有什么比不起作用的应用程序更快地失去客户的机会了。
我们需要适当的项目时间来进行尝试,并且一位知道他们正在进入的客户,愿意给它一个旋转(很难找到)的客户。
回答
Excelsior JET是最终答案