用Emacs进行Java开发
用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, 是不是很多没听说过呢?
所以,去看开源项目就是长见识的时候了…”
所以,可以这么理解,构建工具是必须的。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.1 Gradle基础入门
6.2 Eclipse中使用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 安装
然后,在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进行Java开发的更多相关文章
- 转:java开发的10位牛人
文章来自于:http://it.deepinmind.com/java/2014/04/10/top-10-java-people-you-should-know.html James Gosling ...
- 阿里巴巴Java开发手册评述
2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...
- 阿里巴巴Java开发手册评
2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...
- 你知道吗?Java开发的10位牛人
James Gosling 1983年,Gosling获得了加州大学的计算机科学学士学位.1990年,他获得了卡内基梅隆大学的计算机科学博士学位,师从Bob Sproull.在攻读博士期间,他自己开发 ...
- 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(五)
笔者作为一名有数年工作经验的Java程序员,仔细研读了这份手册,觉得其是一份不可多得的好材料.阿里巴巴在发布时所说,“阿里巴巴集团推出的<阿里巴巴Java开发手册(正式版)>是阿里巴巴近万 ...
- 【搬砖】安卓入门(1)- Java开发入门
01.01_计算机基础知识(计算机概述)(了解) A:什么是计算机?计算机在生活中的应用举例 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代 ...
- 【java开发】ubuntu常用命令及环境搭建
学习第一天,今天内容相对简单,主要就是ubuntu一些常用命令及常规操作,后续涉及到环境的搭建,也会在本文再更. ubuntu环境搭建 第一种 也是最简单最方便的 通过vm虚拟机软件,下载iso镜像进 ...
- 如何在一台新电脑上配置JAVA开发环境
对于JAVA新手来说,刚开始要学JAVA,而自己的电脑上毫无与JAVA开发有关的环境,应该如何进行配置呢? (安卓新手也需要JAVA开发环境) 第一步,下载.安装java JRE JRE (Java ...
- Java开发环境的搭建以及使用eclipse从头一步步创建java项目
一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...
随机推荐
- A Bite Of React(1)
react: component and views : produce html abd add them on a page( in the dom) <import React from ...
- js中获取input中所输入的值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- SQLAlchemy应用到Flask中
安装模块 pip install Flask-SQLAlchemy 加入Flask-SQLAlchemy第三方组件 from flask import Flask # 导入Flask-SQLAlche ...
- ReactOS 无法显示中文的问题
其实非常简单, 实际上是因为包里面没有中文字体,所以输出文字都是乱码, 去 https://svn.reactos.org/optional/ 这里,下载ttf字体文件, 把字体文件放到源码中 mod ...
- Primeng UI框架中 分页组件用法
1.在当前模块或当前页面的对应的module.ts文件中引入相应组件模块,如:core.module.ts模块. import { PaginatorModule } from 'primeng/pr ...
- Codeforces 354B 博弈, DP,记忆化搜索
题意:现在有一个字符矩阵,从左上角出发,每个人交替选择一个字符.如果最后字符a数目大于字符b,那么第一个人获胜,否则b获胜,否则平均.现在双方都不放水,问最后结果是什么? 思路:这题需要注意,选择的字 ...
- 一、Centos7安装mysql
Centos7是通过yum下载的,在mysql找到yum下载链接,然后通过wget命令下载到本地 1. 官网的页面的地址 https://dev.mysql.com/downloads/file/?i ...
- mysql查询表的创建时间
mysql查询表的创建时间 查询语句: SELECT table_name,create_time FROM information_schema.TABLES;
- 开源实践分享:Ceph bluestore部署实践
https://blog.51cto.com/99cloud/2119884 Ceph bluestore部署 首先为大家分享Ceph bluestore具体该如何部署,使用环境如下• 单节点• Ce ...
- POJ 3278 Catch That Cow (有思路有细节的bfs)
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...