给不想用或者用不了IDE的同学们.
第一篇 Java SublimeText 编译环境配置及基础程序
第二篇 Java 命令行及SublimeText编译环境配置(二):涉及包的编译选项
1.配置JAVA环境
- 从oracle官网下载JDK安装记住安装目录.
- 添加环境变量
JAVA_HOME
,值为java的安装路径,如C:\Program Files\Java\jdk1.8.0_171\
- 在环境变量
PATH
中添加%JAVA_HOME%\bin
- 添加环境变量
CLASSPATH
,值为.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
2.java编译运行简介
(1)无包
- 当写好一个java文件A.java后,可以在该目录的命令行中使用
javac A.java
来将它编译为.class文件. - 使用
java A
来将它运行,注意不要在A后添加后缀名
(2)带包,
- 首先,包名要和目录名分别对应.
- 如果在com目录下有一个A.java文件,且A类属于包com. 编译时应当在com目录中使用
javac A.java
,会生成com/A.class - 但运行时,应当在com目录外使用
java com.A
来将其执行.
(3)javac -d .
- 当不添加-d选项时,会在与java文件相同的目录下生成class文件
- 添加-d <目录> 时,会在指定的目录中生成class文件
- 添加-d .时,会在当前目录下按包结构生成class文件
注意class文件必须遵循严格的包结构对应的目录结构,而java文件没有这个限制.
所以,java文件作为源文件可以与class放在一起,也可以分开放.
java文件也可以全放入同级目录中,编译时添加-d .选项生成包目录结构.
3.import机制
import
一个java程序可以调用其他写好的class文件,为了避免重名,需要加上包名来唯一表示.
比如com.straightman.models.Essay.getID()
是一个Essay类的静态函数.
这样写未免也太麻烦,有的时候你只会用到com.straight.models包里的Essay类而不可能用到其他的Essay类,就可以使用import com.straightman.models.Essay;
提前声明.
之后只要直接写Essay.getID()就好.
CLASSPATH
上文中还有一个问题,java该从哪里去找那个com包?
答案是java会遍历所有的classpath,在每个路径里按上文的格式查找,直到找到对应的类或者返回一个错误.
所以,classpath就是用来告诉java你将你的目录结构或者依存包放置在了哪里,方便它去寻找.
jar
jar是按目录结构打包压缩好的class文件,可以直接在jvm里运行,也可以设置在classpath里然后去import其内部的内容.
在设置classpath时,可以将其视为一个文件夹.
4. java工程的几种配置方法
- 将所有的class文件与java文件对应混合放置,编译选项为
javac A.class
,将工程目录添加到classpath中.这样做的好处是结构清晰,不便之处是需要添加classpath. - 将所有java文件放在统一目录中,编译选项为
javac -d. A.class
所有class文件按包结构放置,根目录与java文件同级.优势劣势与上方相反. - 应该有更好的方法,但是我现在的servlet程序只需要编译成功即可,日后再补.
5. sublime配置
- 默认选项,
javac -d. name.java
编译,java name
CMD中运行.适用于无包编译运行,以及以上的第2种情况. javac -d. name.java
编译,java name
sublime中运行.适用于不需运行或图形界面的场景.javac name.java
编译,submie中运行,适用于以上的第一种情况的编译.javac name.java
编译,cd.. && java package_name.name
运行,一种玄学做法,适合于只有一层包的第一种情况,非常方便且不用加classpath.
不考虑第二种项目结构的情况下,简单来说
- 单文件编译CMD运行
- 单文件编译sublime运行
- 多层package中编译当前文件到当前目录,注意classpath.
- 单层package大杀器
{
"shell_cmd": "javac -d . -encoding UTF-8 -Xlint:all \"$file\" && start cmd /c \"java \"$file_base_name\" & pause>>nul\"",
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"selector": "source.java",
"encoding":"UTF-8",
"variants":
[
{
"name": "Run in sublime",
"shell_cmd": "javac -d . -encoding UTF-8 -Xlint:all \"$file\" && java \"$file_base_name\" & pause>>nul"
},
{
"name": "local compile",
"shell_cmd": "javac -encoding UTF-8 -Xlint:all \"$file\" && java \"$file_base_name\" & pause>>nul"
},
{
"name": "single package",
"shell_cmd": "@echo off& for %i in (\"%cd%\") do set x=%~ni& cd..& javac -encoding UTF-8 -Xlint:all \"$file\"&& start cmd /c \" java \"%x%.$file_base_name\"& pause>>nul\""
},
]
}
6. java ee的sublime配置
暂时没什么好说的,附赠一个开局snippet
<snippet>
<content><![CDATA[
package com;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(
name = "${1:Hello}Servlet",
value = {"/${1:Hello}"},
loadOnStartup = 0
)
public class ${1:Hello}Servlet extends HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request,response);
}
}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>servlet</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.java</scope>
</snippet>