将项目从C#迁移到Java

随着办公室人员配置的一些变化,C#专业知识的水平急剧下降,现在有更多的Java开发人员。 它已经达到了高层正在考虑将用C#编写的现有.NET项目移植到Java世界的程度。

除了完全从头开始的明显问题之外,该公司可以通过.NET C#成功实现项目开发的可能方式到Java?

以下是需要考虑的事项:

  • 这是一个大项目吗? 如果是,请尽量坚持使用C#
  • 这个中型项目是否包含组件? 如果是,请尽量坚持使用C#
  • 这个小项目是否只在Windows上部署? 如果是的话,试着坚持使用C#
  • 这是旧的源代码吗? 如果是,请尽量坚持使用C#
  • 您是否使用Windows操作系统特定的API? 如果是,请尽量坚持使用C#
  • 您是否使用没有Java对应的任何第三方API? 如果是,请尽量坚持使用C#
  • 你在“深度”(数据绑定,用户控件等)中使用.Net吗? 如果是的话,试着坚持使用C#
  • 迁移时间比获得新的/转换的C#人更容易接受? 如果不是,请尽量坚持使用C#
  • 如果您要使用会改变演示文稿的Java框架,您认为最终用户不会接受更改吗? 如果是的话,试着坚持使用C#
  • 检查商业广告

如果您决定转换:

  • 去每个组件
  • 去每层
  • 有很多测试
  • 检查是否有工具可以帮助(无论有多少帮助)迁移

为了补充Brian和Eric的意见,我想说在我看来,为Java开发人员选择C#应该是直截了当的。 它们在概念上非常相似,我建议培训Java开发人员以获得一些C#技能,这样您就不会被迫去处理迁移过程中的麻烦。

我赞同Joel的观点,即完全重写几乎总是一个错误 。 其他海报是正确的:C#和Java足够相似,任何有能力的Java开发人员都应该能够在几周或几个月内成为C#的主管。 这并不是说他们会成为专家。 这需要更长的时间,但只要你有一些C#开发人员可以指导这个过程,那么你应该没问题。

如果不了解您的应用程序的具体情况,很难评论这种转换是好是坏也是:大小,应用类型,行业等等。

我对这样的转换非常保持沉默,因为在我看来, C#现在是一种比Java更现代的语言 ,我说这是一个十多年来一直是Java开发者的人(自1.0.2以来) /1.1天)。

这并不是说Java很糟糕。 不是。 Sun确实有一个悬在它上面的云,并表明近年来不愿意或无法推动该平台向前发展。

无论涉及哪种语言,该公司的管理层听起来都很疯狂。 对于除了一个简单的应用程序以外的任何东西,如何从头开始重写整个代码库而不是仅仅聘请具有正确语言的某些技能的单个人在经济上是否合理? 这是一个众所周知的问题:太多的闲钱?!

现有代码有多长时间处于开发阶段? 如果它刚刚开始,我可以理解这一点。 如果它被发布并且拥有活跃的用户,那么抛弃它将永远不会有意义。 如果您将C#代码捐赠给具有合适技能的初创公司,请考虑一下他们对您的启动程度。

在将.NET项目转换为Java之前,所有参与转换项目的Java开发人员都将学习C#。 因此,您不再需要将其转换为Java(并且您可以丢弃转换中生成的所有Java代码),因为现在您有一个可以同时执行Java和C#的开发团队。 问题解决了。 :d

如果有任何已经隔离的组件或任何组件使用面向服务的体系结构,您可以想象一次迁移一个组件(每个组件都重写)并且仍然使用相同的组件相互通信可互操作的网络协议。 可能取决于我们正在谈论的应用程序类型。

确保你有大量的测试 ,因为这样的迁移会让你咬到最不希望的地方。

您是否在生产中拥有更多.Net或更多Java应用程序。 如果您已经对.Net服务器和应用程序进行了大量投资,为什么不要求Java开发人员中的志愿者转移到.Net? 语言和语法非常相似,因此很难学习框架,除非他们花费所有时间进行UI开发,即使学习框架也不是那么难。

在我们的办公室里,我们有许多非常优秀的开发人员,他们根据需要在Java和.Net之间来回移动。

为了向管理层certificate,您总是需要谈谈投资回报率和数字。 向他们表明,如果您移动这些应用程序,将花费大量时间,QA资源,并且如果由于某些其他项目或新开发变得重要而被取消优先级,则可以轻松退居二线。

当我向他们展示时间表,投资回报率,涉及的工作,涉及金钱等时,我取得了成功。

现在谈到实际问题,我确实认为Java开发人员能够支持C#,除非他们对Microsoft技术有一些基本的心理障碍。

看看Net2Java ,它可以帮助您将代码从C#转换为Java。 我怀疑它会是完美的,但它是从任务中消除大量苦差事的一种方法,让你留下不兼容的框架调用和语言特征的纠结。

完成后,您的任务就像任何其他大型迁移项目一样 – 再次进行测试,测试和测试。 unit testing,系统集成测试,然后是最终用户测试。 您应该使用原始应用程序中已经存在的那些测试,除了unit testing之外,它们仍然是相关的。

如果决定这样做,您很可能会从混合方法中受益,在这种方法中,您可以在同一个应用程序中混合使用C#和Java,因为它会将场景从瀑布式转换更改为渐进式迁移。 在这里,我知道两种可能性:

1)ikvm( http://www.ikvm.net/ )允许您在.NET运行时中运行Java代码。 这允许Java代码调用C#代码,反之亦然。 然后,您可以冻结C#代码开发,并在保留function应用程序的同时,将修改后的function慢慢添加到Java部分。

2)Mainsoft( http://dev.mainsoft.com/Default.aspx?tabid=130 ),它允许您将.NET字节码编译为Java字节码。 他们有免费入门版本。 我没有使用该产品的经验,但他们在我们的平台上大量宣传,该平台只提供Java。

我不是Java专家,但根据我作为C#粉丝使用Java代码的经验,以下是一些可能的麻烦:

  • generics在Java和C#中的实现方式不同。
  • Java和C#之间的Boxing / Unboxing行为是不同的
  • Java类命名约定+批量C#生成的代码
  • 字符串处理(即Unicode / ASCII问题)可能会有问题,具体取决于移植的Java / C#代码的质量。

就个人而言,我认为从头开始写作根本不是一个坏主意。 既然你已经有了一个有效的架构。

我有点惊讶,甚至没有人提出拒绝移民的想法。

我不相信C#开发人员可以被迫切换到Java(反之亦然),因为他被告知(好吧,如果他可能会用枪威胁)。 我花了很多时间,锻炼和激情来掌握至少一个技术堆栈。 您无法通过新技术在一夜之间开始,并期望提供相同的质量。

在被告知开始迁移之前,我个人不会打扰。 在这一点上,我告诉经理我是.NET的人,不会因为他们决定改用另一种技术。

至于技术方面,不是语言语法不同而是图书馆及其function。 当然,如果.NET 3.5的所有最新function都被广泛使用,那么语言差异将为您提供真正的挑战。

这当然是一种有趣的方式,只是决定将应用程序从.NET迁移到Java。 有人不知道所涉及的麻烦……

可能你可以使用jni4net – opensource bridge ? 或者我知道的其他选项列表。