用Emacs进行Java开发

*/-->

code {color: #FF0000}
pre.src {background-color: #002b36; color: #839496;}

用Emacs进行Java开发

Table of Contents

1 效果(Ensime做后端,使用JavaFx开发界面)

2 Java开发的IDE

2.1 Eclipse和IntelliJ IDEA

Java开发的两个常用IDE是Eclipse和IntellJ IDEA。其中,Eclipse是一个免费和开源的版本,其他的很多语言的IDE也是使用它,然后,进行修改的。IntelliJ IDEA是一个收费的IDE,据说比Eclipse好用很多。这两个我都用的不多,Eclipse相对而言还要多一点。

3 Java开发的构建工具

什么是构建工具呢?

最早期的时候,是单文件的项目,根本不需要构建工具,直接编译那个单文件就可以。当项目变大,变复杂,项目的文件越来越多,然后,出现第一个构建工具:Make,后来,其发展为GNU Make。但是,由于需求的不断涌现,项目不仅仅只需要编译,还需要测试、部署等各种任务,各种语言出现了各种各样的构建工具。
当前,JVM生态圈由三大构建工具所统治:

  • Ant
  • Maven
  • Gradle

3.1 Ant

ANT是最早的构建工具,基于idea,好象是2000年有的,当时是最流行java构建工具,不过它的XML脚本编写格式让XML文件特别大。对工程构建过程中的过程控制特别好。

3.2 Maven

Maven它是用来给Ant补坑的,Maven第一次支持了从网络上下载的功能,仍然采用xml作为配置文件格式,它的问题是不能很好的相同库文件的版本冲突。Maven专注的是依赖管理,构建神马的并不擅长。

3.3 Gradle

Gradle属于结合以上两个的优点,它继承了Ant的灵活和Maven的生命周期管理,它最后被google作为了Android御用管理工具。它最大的区别是使用groovy语言作为配置文件格式,不用XML进行配置,使得脚本更加简洁。

4 既有IDE,何需构建工具?

我们一直搞不懂,既然,已经有Eclipse、IntelliJ IDEA等IDE工具,开发起来,创建项目,然后,点一下run就可以了,非常方便了,还要弄一堆的构建工具出来,麻不麻烦?为什么呢?

觉得应该很多同学有和我一样的疑惑,所以分享下

1.使用github上的开源项目时是不是经常发现有个叫maven的东西?

2.第一次使用Android studio时是不是要下载一个gradle的玩意?

折腾了一天,想导入下github的客户端源码。当然现在还没成功…各种看不懂的错误。郁闷为什么他们弄这些高端玩意干嘛,我们平时eclipse里面不一样的好好的开发吗。

作者:Antsdot蚁点
链接:https://zhuanlan.zhihu.com/p/23634332
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

同样,这里也有一个回答:

“一般而言,一个比较正规的项目都不会基于IDE进行构建…一般会用ant, maven, gradle , 为什么不用IDE呢?

首先,是IDE的选择,有人喜欢,用Vim,Eclipse,IntelliJ IDEA,收费的,免费的.

特别是公开的项目,你用什么IDE 相当于为这个IDE 打广告了..

所以,一般而言都是用构建工具,而不是IDE .实际上各种IDE 也是基于各种构建系统,也正是不同的IDE,它们的构建方式不同,所以要让不同的IDE间能一起开发,于是需要一个统一的构建工具,只是你平时不关注而已..

扯到构建工具, 一般c/c++ 项目用make,或者 premake. 而Java 一般是ant,ivy,gradle,maven,还有直接的shell, 是不是很多没听说过呢?

所以,去看开源项目就是长见识的时候了…”

来源:http://www.oschina.NET/question/558461_117208

所以,可以这么理解,构建工具是必须的。IDE只是内置了某些构建工具,但是这个工具不一定具有通用性,或者工具的功能不一定强大。为了统一,开发了一套独立的标准和工具,就是我们所说的构建工具。这些工具,各个IDE也可以使用。

更多构建工具的比较:
http://ensime.org/build_tools/

5 使用Maven进行Java开发

maven 使用 pom.xml 配置文件来进行项目的配置。
所有的库的最新配置信息,可以从这个网站上查询到:
https://mvnrepository.com

6 使用Gradle进行Java开发

从上面这么多内容,我们可以知道,从长远的角度来看,要想项目能够在更大的范围内扩展,特别是开源的项目,最好是使用独立的构建工具来构建项目,那么,Ant、Maven和Gradle应该选哪个呢?

当然是选Gradle了,这个既具有了Ant的灵活性和强大功能,又有Maven的依赖和库管理,语言groovy又比XML要简洁和灵活得多。所以,Gradle必然会把这两个取代,尽管目前,Maven可能还是主流,但不久,应该就是Gradle了。

6.3 Emacs中的Gradle集成

  • 首先,可以创建一个yasnippet:

    # -*- mode: snippet -*-
    # name: build.gradle for springboot
    # key: springboot
    # --
    buildscript {
    ext {
    springBootVersion = '${1:1.5.3.RELEASE}'
    }
    repositories {
    // mavenCentral()
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
    }
    dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:$\{springBootVersion\}")
    // classpath('se.transmode.gradle:gradle-docker:1.2')
    }
    } allprojects {
    repositories {
    // mavenCentral()
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
    }
    } apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot' group = '${2:com.example}'
    jar {
    baseName = '${3:`(file-name-base (directory-file-name (file-name-directory (buffer-file-name))))`}'
    version = '0.1.0'
    } sourceCompatibility = ${4:1.8}
    targetCompatibility = $4 dependencies {
    compile("org.springframework.boot:spring-boot-starter${5:-web}")
    // compile("org.springframework.boot:spring-boot-starter-data-jpa")
    // compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    // compile("com.h2database:h2")
    // compile("mysql:mysql-connector-java")
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile("org.springframework.boot:spring-boot-devtools")
    compile("junit:junit")
    } eclipse {
    classpath {
    containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
    containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
    }
  • 然后,就可以这eshell中,执行
    gradle bootrun
    

    来进行执行了。

  • 自动编译
    其中,有一点非常有趣,就是自动编译,当我们做了修改之后,自动编译,这样,我们就不需要反复的启动了。这个这Maven中是可以通过devtools来实现的,但是gradle不支持。后来,中google上找了很久,发现gradle有一个–continuous选项是做这个事情的。

    gradle -t classes processResources
    

    -t 也可以是 –continuous

7 使用sbt进行Scala/Java开发

7.1 安装

http://www.scala-sbt.org/

然后,在sbt的配置文件夹~/.sbt/中添加文件结构示例(需要手动添加文件夹或者文件):

[-] .sbt
|--[-] 0.13
| |--[-] plugins
| | `----- plugins.sbt
| `----- global.sbt
`----- repositories

7.2 在sbt中安装sbt-ensime插件

编辑 ~/.sbt/0.13/plugins/plugins.sbt ,并添加:

addSbtPlugin("org.ensime" % "sbt-ensime" % "1.12.5")

7.3 为sbt支持开发版的ensime

编辑 ~/.sbt/0.13/global.sbt

import org.ensime.EnsimeCoursierKeys._
ensimeServerVersion in ThisBuild := "2.0.0-SNAPSHOT"

7.4 在sbt中安装coursier (有兼容性问题,暂时不用)

7.5 由于大陆连接官方maven库速度很慢,需要使用国内的镜像

在~/.sbt/下创建repositories文件,并输入:

[repositories]
local
# osc: http://maven.oschina.net/content/groups/public/ # 已经不能使用了,使用阿里云替代
aliyun:http://maven.aliyun.com/nexus/content/groups/public/
maven-central:http://repo1.maven.org/maven2/
store_2:http://repo2.maven.org/maven2/
uk_mir:http://uk.maven.org/maven2/
store_mir:http://mirrors.ibiblio.org/maven2/
typesafe: http://dl.bintray.com/typesafe/ivy-releases/,[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sbt-releases-repo:http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
sbt-plugins-repo:http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]

这样速度就会快一些。

7.6 Emacs中安装插件sbt-mode

(use-package sbt-mode
:commands sbt-start sbt-command
:init
(setq
sbt:prefer-nested-projects t
sbt:scroll-to-bottom-on-output nil
sbt:default-command ";compile ;test:compile ;it:compile")
:config
;; WORKAROUND: https://github.com/hvesalai/sbt-mode/issues/31
;; allows using SPACE when in the minibuffer
(substitute-key-definition
'minibuffer-complete-word
'self-insert-command
minibuffer-local-completion-map) (bind-key "C-c c" 'sbt-command sbt:mode-map)
(bind-key "C-c e" 'next-error sbt:mode-map))

7.7 在eshell中键入 sbt ,然后,键入 ensimeConfig ,创建 .ensime

7.8 在Emacs中执行 ensime 命令就可以启动后端 ensime server

7.9 自己编译 ensime server

  • 获取源代码

    git clone https://github.com/ensime/ensime-server.git
    
  • 然后,cd 到ensime-server文件夹中
  • 运行 sbt ensimeConfig 产生 .ensime 文件
  • 再执行 compile 进行编译

8 为什么使用Emacs来开发?

Emacs被称作是一个操作系统,它可以跨平台,跨语言,只要掌握一个编辑器,就可以覆盖所有的语言了。有这样的优势,实在想不到什么理由不用它来作为开发工具。作为一个编辑器,它擅长的是编辑。对于需要大量解析的工作,它不是不擅长,其实也很擅长,比如CEDET,只是太慢了,对于大型项目,速度始终是个硬伤。
这样,就需要和其他的工具来进行配合使用。配合使用,就会涉及到交流和沟通的协议。一般的程序,直接把参数,或者字符串传递过去,得到返回的字符串就可以了。这是以字符串为传递介质。
对于,有些比较复杂的功能,单纯的传递字符串已经不能满足需求了。这样就会有更加复杂的数据结构,来进行传递工作。这个数据结构,双方要能理解,就必须有一个规定,这就是协议。

9 Emacs中的几款主要Java解释器或者后端

9.1 jdee(old)

9.2 eclim(eclipse as server)

9.3 meghanada(推荐)

我之前本来试用一下meghanada,结果发现windows下使用不了,就作罢了,转而使用ensime,但是ensime对scala支持很好,对java很多地方支持得并不好。于是,又硬着头皮来看meghanada的源代码,因为既然是java写的,怎么可能只能在linux运行呢。java本来就是write once, run everywhere的。看完源代码之后,发现确实是因为文件路径,linux使用的是"/",而windows是用的"\"导致的,于是提交了代码,现在linux、Mac和windows下都是可以正常运行的。

9.4 ensime

9.4.1 Introduce

https://coderwall.com/p/avlrna/emacs-ensime-for-your-scala-coding
http://blog.ssanj.net/posts/2011-04-06-ensime-with-emacs.html
构建工具和ensime配置工具,这里要分开来讲。一般构建工具和ensime配置插件是使用一套的。但有时,gradle的ensime配置插件过时了,sbt的ensime插件是由官方更新的,所以,总是和ensime配套升级的。所以,用sbt的插件进行配置总是可行的。但是,sbt是一个新的构建系统,所以,在基础的构建,如对springboot的支持中有时是不稳定的,这时使用Gradle或者Maven会更稳定。
结论:当sbt可以满足构建需求时,使用sbt是最方便的,既可以配置ensime,又可以构建。当sbt构建出问题时(极少数情况下),这时可以使用Gradle或者Maven来进行构建。
ensime的配置:

9.4.2 sbt(推荐)

http://ensime.org/build_tools/sbt/

  • install
    ~/.sbt/0.13/plugins/plugins.sbt

    addSbtPlugin("org.ensime" % "sbt-ensime" % "1.12.14")
    
    sbt ensimeConfig
    

9.4.3 Maven(配合使用)

http://ensime.org/build_tools/maven/

  • install
    ~/.m2/settings.xml :

    <build>
    <pluginGroups>
    <pluginGroup>org.ensime.maven.plugins</pluginGroup>
    </pluginGroups>
    </build>

    国内加速使用阿里云镜像,在<build>节点下添加,这样速度就会快很多倍了:

    <mirrors>
    <mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>
    </mirrors>
  • use
    mvn ensime:generate
    

9.4.4 Gradle(配合使用)

http://ensime.org/build_tools/gradle/

  • install
    ~/.gradle/init.gradle

    apply plugin: AddEnsimePlugin
    class AddEnsimePlugin implements Plugin<Gradle> {
    def supportedPlugins = [
    'org.gradle.api.plugins.JavaPlugin',
    'org.gradle.api.plugins.ScalaPlugin',
    'jp.leafytree.gradle.AndroidScalaPlugin'
    ] void apply(Gradle gradle) {
    def added = false gradle.allprojects { project ->
    project.with {
    if (parent == null) { buildscript {
    repositories {
    mavenLocal()
    mavenCentral() jcenter()
    }
    //if using snapshot, change rootProject.ensime.serverVersion to a snapshot
    //update this property to the lated ensime-gradle version
    dependencies {
    classpath 'net.coacoas.gradle:ensime-gradle:0.3.0-SNAPSHOT'
    }
    }
    } plugins.whenPluginAdded { plugin ->
    if (!added && supportedPlugins.contains(plugin.class.name)) {
    rootProject.apply plugin: 'org.ensime.gradle'
    //update the server version to the latest supported by the ensime-gradle plugin
    rootProject.ensime.serverVersion = "2.0.0-SNAPSHOT"
    added = true
    }
    }
    }
    }
    }
    }
  • use
    gradle ensime
    

10 Ensime 中常见的操作命令

10.1 sbt ensimeConfig

生成.ensime配置文件

10.2 sbt run

运行整个项目

10.3 sbt core/it:testOnly *JavaCompilerSpec – -z addListener

运行正则表达式匹配的测试用例。

Date: 2017-02-12 20:07

Author: WEN YANG

Created: 2018-06-08 Fri 21:49

Emacs 25.3.1 (Org mode 8.2.10)

Validate

用Emacs进行Java开发的更多相关文章

  1. 转:java开发的10位牛人

    文章来自于:http://it.deepinmind.com/java/2014/04/10/top-10-java-people-you-should-know.html James Gosling ...

  2. 阿里巴巴Java开发手册评述

    2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...

  3. 阿里巴巴Java开发手册评

    2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...

  4. 你知道吗?Java开发的10位牛人

    James Gosling 1983年,Gosling获得了加州大学的计算机科学学士学位.1990年,他获得了卡内基梅隆大学的计算机科学博士学位,师从Bob Sproull.在攻读博士期间,他自己开发 ...

  5. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(五)

    笔者作为一名有数年工作经验的Java程序员,仔细研读了这份手册,觉得其是一份不可多得的好材料.阿里巴巴在发布时所说,“阿里巴巴集团推出的<阿里巴巴Java开发手册(正式版)>是阿里巴巴近万 ...

  6. 【搬砖】安卓入门(1)- Java开发入门

    01.01_计算机基础知识(计算机概述)(了解) A:什么是计算机?计算机在生活中的应用举例 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代 ...

  7. 【java开发】ubuntu常用命令及环境搭建

    学习第一天,今天内容相对简单,主要就是ubuntu一些常用命令及常规操作,后续涉及到环境的搭建,也会在本文再更. ubuntu环境搭建 第一种 也是最简单最方便的 通过vm虚拟机软件,下载iso镜像进 ...

  8. 如何在一台新电脑上配置JAVA开发环境

    对于JAVA新手来说,刚开始要学JAVA,而自己的电脑上毫无与JAVA开发有关的环境,应该如何进行配置呢? (安卓新手也需要JAVA开发环境) 第一步,下载.安装java JRE JRE (Java ...

  9. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

随机推荐

  1. OSG+Visual Studio2015项目变量设置;

    OSG源码经过CMAKE编译后: 1.配置OSG环境变量: 用户变量的PATH中添加路径 C:\OSG\bin系统变量中添加新变量OSG_FILE_PATH为 C:\OSG\data 2.VS新建项目 ...

  2. 牛客网练习赛 2 烟花(概率dp)

    题目传送门 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld 题目 ...

  3. java收藏的技术资料链接

    TCP三次握手详解: https://blog.csdn.net/baiyan3212/article/details/81302448 ICE通信: https://blog.csdn.net/zh ...

  4. android Manifest.xml 文件详解

  5. netbean out of memory java heap space

    When run test file in netbean. all dependency and resource are right, but it raise up java.lang.OutO ...

  6. css的9个常用选择器

    1.类选择器(通过类名进行选择) <!DOCTYPE html> <html> <head> <title></title> </he ...

  7. HDU-3333 Turing Tree 分块求区间不同数和

    HDU-3333 Turning Tree 题目大意:先给出n个数字.面对q个询问区间,输出这个区间不同数的和. 题解:这道题有几种解法.这里讲一下用分块解决的方法.( 离线树状数组解法看这里 Hdu ...

  8. poj 2104 无修改主席树

    题目大意: 求序列的区间第k大 基本思路: 因为我根本就没有思路,知道这是主席树,我就去学了下,在b站上看了uestc的教学视频,然后看了一篇博客,博客http://www.cnblogs.com/E ...

  9. numpy.unique

    Find the unique elements of an array. Returns the sorted unique elements of an array. There are thre ...

  10. Freemarker模板和依赖

    <html> <head> <meta charset="utf-8"> <title>Freemarker入门小DEMO < ...