java代碼總是要先編譯再執行,這樣很操作起來很麻煩。
這個一個小工具可以直接運行ava文件,省去手動編譯的麻煩。
類似於go 一樣,直接運行go run 就可以運行。可以在CMD運行,也可以在EditPlus中運行。
命令行運行
javaCompile.exe -h
-h 輸出此幫助消息
-p string
輸出需要編譯執行的Java文件(絕對路徑) (default "./")
-v 輸出產品版本並退出
javaCompile.exe -p d:/javahome/Sort.java
d:/javahome/Sort.java
[91 53 44 32 52 44 32 51 44 32 50 44 32 49 44 32 48 44 32 57 44 32 56 44 32 55 44 32 54 93 13 10 57 13 10 56 13 10 55 13 10 54 13 10 53 13 10 52 13 10 51 13 10 50 13 10 49 13 10 48 13 10]
EditPlus 插件
點擊下載 javaComplie.exe
按時下圖配置
然後趕緊寫一個java文件試試。
…
嗯。可以用,很棒。
代碼如下:
package main
/**
* 直接運行Java文件
*/
import (
"flag"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path"
"path/filepath"
"regexp"
"strings"
)
var (
h bool
v, V bool
t, T bool
p string
java_home string
// debug bool
)
// debug = true
func init() {
flag.BoolVar(&h, "h", false, "輸出此幫助消息")
flag.BoolVar(&v, "v", false, "輸出產品版本並退出")
flag.StringVar(&p, "p", "./", "輸出需要編譯執行的Java文件(絕對路徑)")
}
func main() {
flag.Parse()
if h {
flag.Usage()
}
if v {
fmt.Println("1.0.0")
}
if p == "" {
alert("請輸入參數p")
}
fmt.Println(p)
fileinfo, err := os.Stat(p)
checkErr(err)
ext := ".java"
fileName := strings.Replace(fileinfo.Name(), strings.ToUpper(ext), ext, 1)
isExtFile(fileName, ext)
checkJavaHomeEnv()
fileNameNoExt := strings.Replace(fileName, ext, "", 1)
filePath, _ := filepath.Abs(filepath.Dir(fileinfo.Name()))
// fmt.Println("文件路徑:" + filePath)
fileContext, _ := readAll(p)
packagePath := getPackage(fileContext)
compileDir := strings.Replace(filePath+"/out/classes/"+packagePath, "\\", "/", -1)
// compileDir := filePath + "/out/classes/" + packagePath
if exiSrcDir(compileDir) {
compileDir = strings.Replace(compileDir, "/src/", "/", 1)
}
// fmt.Println("編譯文件路徑:" + compileDir)
createDir(compileDir)
// compile
compileCmdStr := "javac -encoding UTF-8 -d " + compileDir + " " + filePath + "/" + fileName
execCmd(compileCmdStr)
//run
runCmdStr := "java -classpath " + compileDir + " " + fileNameNoExt
execCmd(runCmdStr)
}
func alert(msg string) {
fmt.Println(msg)
os.Exit(1)
}
func createDir(folderPath string) {
if _, err := os.Stat(folderPath); os.IsNotExist(err) {
// 必須分成兩步:先創建文件夾、再修改權限
os.MkdirAll(folderPath, 0777) //0777也可以os.ModePerm
os.Chmod(folderPath, 0777)
}
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
func checkJavaHomeEnv() {
java_home = os.Getenv("JAVA_HOME")
if java_home == "" {
alert("請設置{JAVA_HOME}環境變量")
}
}
func isExtFile(fileName string, ext string) bool {
fileExt := path.Ext(fileName)
if fileExt != ext {
alert("文件:" + fileName + ",不是java文件")
}
return true
}
func readAll(filePth string) ([]byte, error) {
f, err := os.Open(filePth)
if err != nil {
return nil, err
}
return ioutil.ReadAll(f)
}
func getPackage(context []byte) string {
fileContext := string(context[:])
packageName := ""
exp := regexp.MustCompile("package(.*);")
result := exp.FindAllStringSubmatch(fileContext, -1)
if result == nil {
return packageName
}
match := result[0][1]
packageName = strings.Trim(strings.Replace(match, ".", "/", -1), " ")
return packageName
}
func execCmd(cmdStr string) {
// fmt.Println(cmdStr)
args := strings.Split(cmdStr, " ")
// fmt.Println(args)
cmd := exec.Command(args[0], args[1:]...)
out, _ := cmd.CombinedOutput()
fmt.Printf("%s\n", out)
// checkErr(err)
}
func exiSrcDir(path string) bool {
return strings.Contains(path, "\\src") || strings.Contains(path, "/src")
}