運行編譯java文件小插件

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")
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章