簡體   English   中英

運行 java 代碼表單終端出現錯誤

[英]running java code form terminal getting error

我發現一些參考說我可以在文件開頭添加#!/usr/bin/java --source 12並直接從終端運行文件。 我可以在我的本地機器上使用它運行,但是,當我在 Github 操作上嘗試相同時,我收到錯誤error: invalid value for --source option: 12

我不是 shell 腳本或 java 的真正專家,有人可以幫我理解這個 --source 的意思是它是 java 版本嗎,我嘗試在 Github 操作上設置相同的版本 (jdk18) 但仍然沒有用。

java (運行時可執行文件)只能運行class個文件。 直到,也就是說,java12,其中一個普通的 JDK 發行版(而不是一些像 Azul 發布的奇怪的 JREs ^1)有一個java.exe可以直接運行 java 個文件。 這是簡單的糖——當然,編譯器仍然參與其中。 只不過java會幫你執行而已。

你不需要--source 12 只需java MySourceFile.java就可以了。 編輯源文件頂部的注釋,它應該只是#!/usr/bin/java 您確實需要的是命令行PATH上的java是 java v12 或更高版本,而它不是. 您的 java 源文件對此無能為力,您將不得不強加給您的用戶至少安裝 java12,否則這根本不會也無法工作。 看起來您正在使用 linux 發行版或其他發行版; aptyumsnap或您擁有的任何 package 管理器將告訴您如何解決此問題:安裝 java17,並卸載 rest 或使用java-alternatives或您的 package 管理器必須設置默認可執行文件的任何機制(一個/usr/bin/java鏈接到)。 閱讀提供 java17 的 package 的文檔,可能會遵循一些指向通用 java 基礎結構 package 的鏈接,它應該會告訴您。

這主要是轉移注意力,這不是 java 文件的分發方式。 這幾乎毫無意義,因為:

  1. Java 不是一種傾向於用於快速 shell 腳本式事物的語言。 這些事情往往是自我實現的預言:因為沒有人這樣做,所以圖書館作者在開發他們的 API 時不會考慮它,他們圖書館的用戶也不會為此提出增強請求。 因為公共庫在用於快速即興腳本 shell 時不方便,所以 java 不用於它,從而使循環永久化。

  2. 任何嚴肅的 java 應用程序肯定會涉及包、依賴項等 - 並且此類應用程序不能像這樣運行。

  3. Class 文件與源文件一樣與平台無關。 沒有合理的理由將 java 編寫的 shell-script-esque 工具作為源文件而不是 jar 進行分發,除非對它們進行即興編輯,這會讓您回到第 1 點和第 4 點。

  4. java 核心 API 在 model 的最低公分母上工作:如果有一個主要操作系統不能或不能以某種方式工作,那么 java 根本不會暴露它 例如,在所有 posix 系統上(即除了 windows 之外的幾乎所有主要操作系統),您都有通常的 TERM、KILL、HUP 等信號。 Java 核心庫不允許您與它們交互(除非您深入研究隱藏的sun.misc.* API,它首先不能可靠地工作)。 這使得 java 特別不適合您需要不同 model 的快速命令行腳本:如果至少有一個操作系統可以做到,那么該語言應該有一個庫,如果您嘗試在不支持它的操作系統。 解決此問題的一種簡單方法是第三方庫添加對操作系統特定內容的支持,但您的 model 分發(將#!/usr/bin/java放在頂部並分發源文件)不能包含依賴項。

  5. Java 作為運行時 model 主要專注於最終非常快速地運行事物,代價是開始緩慢。 這對於需要高效運行但會運行相當長一段時間的 web 服務器來說非常棒。 不過,它完全不適合 shell 腳本。

結論:你不想把#!/usr/bin/java放在頂部,即使你可以讓它工作。

[1] JRE 是一個 java 發行版,沒有編譯器和其他開發工具,如 jstack。 這些不能運行java SomeSourceFile.java ,顯然; 他們沒有編譯器。 然而, JRE 死了——不再有 JRE; JDK8 是最后一個附帶官方 JRE 的版本。 JRE 用作分發版 model:最終用戶安裝 JRE,然后您將 jars 發送給他們。 這個 model 已經過時(您現在負責獲得可以在部署機器上運行您的 class 文件的東西),因此 JRE 消失了。 但是,某些 OpenJDK 構建的打包程序(例如 Azul)仍在發布它們,這令人困惑。 因此,'bizarro'。 Azul 和同事這樣做有相對充分的理由,但是,除非您真的知道自己在做什么,否則您不應該使用這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM