Java VS .NET:Java与.NET的特点对比
一、前言
- 为什么要写Java跟.NET对比?
.NET出生之后就带着Java的影子。从模仿到创新,.NET平台也越来越成熟。他们不同的支持者也经常因为孰弱孰强的问题争论不休。但是本文并不是为了一分高下。而是针对Java平台跟.NET平台做一些对比。主要围绕项目构建、Web框架、项目部署展开讨论。相信经过这些讨论可以让Java/.NET工程师对Java平台、.NET平台有更好的了解。
二、项目构建
- 项目构建工具
工欲善其事必先利其器。开发环境配置+工具使用当然要先讲了。
1、表面上的工具
平台 | 工具 | ken.io的解释 |
---|---|---|
.NET | Visual Studio | 微软官方IDE,它具备了开发.NET应用程序的几乎所有工具 |
Java | Idea/Eclipse | IDE,负责管理项目以及代码的运行调试等,依赖于JDK |
Java | Maven | 负责管理项目模板、打包(jar包等),依赖于JDK |
Java | JDK | JRE(Java项目运行环境),Java工具(编译器等) |
.NET工程师要开展工作,安装Visual Studio(后面简称:VS)就可以进行开发了。但是Java开发,只安装IDE是不行的,就算某些IDE会自动安装JDK,甚至是Maven,但是这些还是需要自己配置,不然还可能会踩坑。从开发环境的配置来说,.NET工程师操作上确实简单一些,一直下一步,等待安装完成即可。Java工程师就先要了解下工具,以及各个工具的职责。然后逐一配置。
从这个点上来说,Java的入门曲线会稍陡一些,但是Java工程师也会比.NET工程师更早关注到项目构建的重要环节。
2、实际上的工具
职责 | .NET平台 | Java平台 | ken.io的解释 |
---|---|---|---|
项目管理 | VS | IDEA/Eclips | .NET只有微软官方IDE,Java没有官方的IDE,没有VS好用,但是有多个选择 |
项目模板 | VS+MSBuild | IDE+Maven | .NET项目的模板是VS自带的,是直接符合MSBuild(编译器)标准的,项目由sln+csproj文件组织,Java平台编译器的标准是公开的,目前主流项目都是基于Maven模板来创建,项目由pom.xml文件组织。 |
编译&调试 | VS+MSBuild+SDK | IDE+Maven+SDK | .NET平台的编译器是独立的,Java平台的编译器是集成在JDK中,Maven模板的项目是由pom.xml文件组织,但是编译器并不是认识pom.xml,所以编译需要Maven的参与 |
Package管理 | NuGet | Maven | Nuget是微软官方开源的VS插件,Maven是Apache下的开源项目。ken.io觉得Maven更灵活、强大。NuGet容易上手。 |
打包/发布 | VS+MSBuild+SDK | IDE+Maven+SDK | .NET平台的编译器是独立的,Java平台的编译器是集成在JDK中,Maven模板的项目是由pom.xml文件组织的,但是编译器并不是认识pom.xml,所以打包需要Maven的参与。IDE主要是提供图形化界面替代命令操作 |
从项目管理上说。VS这个IDE更好用一些,项目模板上,.NET项目模板简单易用,Java平台的Maven模板灵活强大。
其实大部分差异都是编译器跟模板带来的差异。.NET平台的编译器虽然是独立的,但是编译器要求是必须用.sln文件+csproj文件组织项目。并且官方提供了丰富好用的项目模板,虽然内容格式也是xml,但是没有那么灵活。
Java平台的编译器的编译配置是xml文档,由于Java官方没有项目模板,IDE只负责帮你组织项目,但是并没有模板,你可以将任意目录指定为SourceRoot(代码根目录),ResourceRoot(资源文件根目录:比如配置文件)也可以任意指定,编译的时候,IDE会将你的项目代码,以及编译器所需要的编译描述/配置xml文档告诉编译器该如何编译你的项目。确实非常灵活,但是也增加了项目管理的成本。包的管理也非常麻烦,还好有Maven结束了这个混沌的Java世界。
- 编码特点
— | .NET | Java |
---|---|---|
类的组织 | namespace:命名空间,name跟目录无关 | Package:name跟目录名一致 |
类 | .cs文件:类名跟文件名无关 | .java文件,类名跟文件名无关,但一个类文件只能定义一个public类 |
编译产出 | .dll,.exe文件 | .jar,.war文件 |
三、框架
.NET的Web框架基本上都是微软官方的,官方的框架也最为流行,而Java平台,除了官方提供的Servlet API(相当于.NET的System.Web)其他的基本都由Spring大家族统治了。本次我们主要对比目前Web开发最常用的MVC框架以及持久层框架
功能 | .NET | Java | ken.io的说明 |
---|---|---|---|
Web核心 | ASP.NET | Servlet | — |
Web框架 | ASP.NET MVC | Spring MVC | ASP.NET MVC是微软官方框架,Srping MVC框架隶属于Spring大家族,依赖于Spring |
视图引擎 | Razor | Thymeleaf/FreeMarker | Razor是微软官方的视图引擎,非常好用,Spring MVC并没有视图引擎,但是有Thymeleaf,FreeMarker。ken.io更喜欢Razor的风格 |
持久层 | Entity Framework | MyBatis | EF是微软官方的持久层框架,易上手但侵入性强。MyBatis配置灵活,强大,无侵入性。这一点ken.io更喜欢MyBatis |
.NET平台的框架由于都是微软官方的,比较好组织,上手容易。Java平台的框架,灵活可配置。这也是Java平台一贯的风格。但是ken.io不得不吐槽的是,Spring MVC作为一个MVC框架,竟然没有自己的视图引擎,那MVC种的View去哪了?
可能是因为Java作为Web后端的主力平台,确实很少关注视图层,但是Spring MVC没有View层引擎,还是感觉不合适。Thymeleaf跟FreeMarker,ken.io更推荐FreeMarker。因为ken.io更喜欢FreeMaker的语法。可能是用惯了Razor的缘故。
四、项目部署
对于项目部署。.NET平台貌似没得选,只能选Windows+IIS,虽然有Mono,但毕竟不是支持所有的类库。而Java平台既可以选择Windows+Tomcat,也可以选择Linux+Tomcat。但是通常会选择Linux+Tomcat毕竟成本低。
职责 | .NET | Java |
---|---|---|
操作系统 | Windows Server | Windows Server、Linux Server |
Web服务器 | IIS | Tomcat(Tomcat是目前最主流的,也有其他的Servlet容易例如:JBoss) |
不过Java平台的特性,Java项目的部署会比.NET项目部署偏麻烦一些。
IIS图形化界面一直下一步,再调整下应用程序池的版本就行了。而Tomcat不论是在Windows,还是在Linux,都通过修改配置文件完成站点配置。
五、后记
- 总结
不管是Java平台还是.NET平台都有各自的优势。平台只是一个工具,我们了解平台都是为了做出更好的选择。但不得不说,Java开源生态的发展势头迅猛,非其他平台可比,不过.NET平台也在弥补自己的短板而推出了.NET Core。期望以后不论是Java还是.NET都能欣欣向荣。
- 备注
.NET程序猿,如果要学习Java,可以看看ken.io写的教程
Java快速入门系列教程:https://ken.io/serie/java-quickstart
如果想一起交流技术可以访问连接扫码加入QQ群:https://ken.io/home/about
本文由 ken.io 创作,采用CC BY 3.0 CN协议 进行许可。 可自由转载、引用、甚至修改,但需署名作者且注明出处。
Java VS .NET:Java与.NET的特点对比的更多相关文章
- java head space/ java.lang.OutOfMemoryError: Java heap space内存溢出
上一篇JMX/JConsole调试本地还可以在centos6.5 服务器上进行监控有个问题端口只开放22那么设置的9998端口 你怎么都连不上怎么监控?(如果大神知道还望指点,个人见解) 线上项目出现 ...
- 【Java大系】Java快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领 ...
- 《深入理解Java虚拟机》Java内存区域与内存溢出异常
注:“蓝色加粗字体”为书本原语 先来一张JVM运行时数据区域图,再接下来一一分析各区域功能: 程序计数器 程序计数器(program Counter Register)是一块较小的内存空间,它可以 ...
- Tomcat报java.lang.OutOfMemoryError: Java heap space错误停止运行如何解决
最近开发的一个商业项目,部署完成后,经常出现Tomcat挂掉的现象,报的异常是:java.lang.OutOfMemoryError: Java heap space,上网google了一下,了解了一 ...
- MyCAT报java.lang.OutOfMemoryError: Java heap space
早上同事反映,mycat又假死了,估计还是内存溢出,查看了一下错误日志. INFO | jvm | // :: | java.lang.OutOfMemoryError: Java heap spac ...
- 【Java】实战Java虚拟机之五“开启JIT编译”
今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Ja ...
- Java提高篇——Java 异常处理
异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...
- Java import以及Java类的搜索路径
如果你希望使用Java包中的类,就必须先使用import语句导入.import语句与C语言中的 #include 有些类似,语法为: import package1[.package2-].cl ...
- [Java] SoapUI使用Java获取各时间日期方法
import java.util.*; import java.text.SimpleDateFormat; // current date String dateNew = today() // t ...
- Tomcat 启动项目报错 java.lang.OutOfMemoryError: Java heap space
近日使用myeclipse 部署web项目,启动tomcat时报错: SEVERE: Error waiting for multi-thread deployment of directories ...
随机推荐
- 计蒜之道 初赛第一场B 阿里天池的新任务(简单)
阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 tt,判断它在另一个根据规则生成的 DNA 碱基序列 ss 中出现了多少次. 首先,定义一个序列 ww: \displ ...
- Ellipse
Description There is an beautiful ellipse whose curve equation is: b > 0)" src="http:// ...
- Android 开发笔记___复选框__checkbox
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- Ajax 跨域 异步 CORS
HTTP access control (CORS) 核心在于使用定制(添加新的header)HTTP header让浏览器和服务器有更多的相互了解,从而决定一个请求或者响应成功还是失败 对于一个 ...
- 数据结构 单链表元素定位 PTA
由于这个很简单,他也貌似没要判断溢出,取巧突破 #include<stdio.h> #include<malloc.h> #include<stdlib.h> // ...
- 在.csproj文件中增加npm, bower, gulp, webpack的构建
<Target Name="RunNpm" AfterTargets="AfterBuild"> <!-- As part of publ ...
- Unity 游戏框架搭建 (二十) 更安全的对象池
上篇文章介绍了,只需通过实现IObjectFactory接口和继承Pool类,就可以很方便地实现一个SimpleObjectPool.SimpleObjectPool可以满足大部分的对象池的需求.而笔 ...
- JS中encodeURI,escape,encodeURIComponent区别
js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...
- windows中更换Jdk版本不生效
本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装jdk1.6前,执行java -version得到 C:\Users\liuxi ...
- Java多线程学习之线程池源码详解
0.使用线程池的必要性 在生产环境中,如果为每个任务分配一个线程,会造成许多问题: 线程生命周期的开销非常高.线程的创建和销毁都要付出代价.比如,线程的创建需要时间,延迟处理请求.如果请求的到达率非常 ...