導航:首頁 > 編程語言 > java的wiki

java的wiki

發布時間:2024-12-07 21:42:26

java 命令行交互輸入庫 JLine 入門

軟體的用戶界面通常分為兩種:GUI(圖形用戶界面)和CLI(命令行用戶界面)。對於經常使用linux的人來說,命令行界面非常熟悉,無論是Shell中的命令輸入界面,還是像GDB這樣的軟體內部交互界面。當開發自己的軟體時,編寫一個CLI變得困難,因為好的命令行界面需要支持額外的常見功能。


一個合格的命令行軟體界面應具備以下三個功能:


這些功能是GNU Readline的一部分。使用庫而非手寫功能可以簡化開發,因為眾多GNU/Linux軟體採用GNU Readline,使其成為事實上的命令行交互標准。GNU Readline是C語言庫,使用其他語言時,需要依賴封裝了底層GNU Readline的庫,Java語言中的JLine就是這樣一種庫。


本文將通過一個例子介紹JLine3的基本用法。JLine3沒有提供標准示例,其wiki文檔也相對簡略。示例程序Example.java較為復雜,難以理解。本文旨在幫助理解JLine3的用法。


基本框架


我們為軟體Fog設計命令行用戶界面,用戶可以輸入四種命令。首先,使用JLine3搭建基礎的REPL(Read-Eval-Print Loop)框架。


框架包含設置命令提示符(prompt)和原樣列印用戶輸入的功能。當用戶輸入Ctrl+D(End of line)時,程序退出。此時,程序已經具備JLine3默認提供的命令歷史和行編輯功能。使用上、下方向鍵顯示上一條/下一條命令,或使用Ctrl+A、Ctrl+E等Emacs快捷鍵進行行內編輯。


命令補全


由於命令補全與程序命令格式緊密相關,我們需自定義補全方式。JLine3中定義命令補全的常見方式是創建Completer類的實例,將其傳遞給LineReader。JLine3內置多個Completer,如FileNameCompleter(補全文件名)和StringsCompleter(根據預定義字元串補全命令名或參數名)。例如,Fog程序的四個命令以CREATE、OPEN、WRITE、CLOSE開頭,使用StringsCompleter對命令第一個單詞進行補全。


然而,簡單補全僅支持命令的第一個單詞補全。若需在命令的任意位置補全,需使用復合補全。復合補全由多個Completer組成,每個Completer負責補全命令中的一個單詞。ArgumentCompleter是補全整條命令的復合補全方式。以CREATE命令為例,該命令有兩條補全需求:第一個單詞需要字元串補全,第二個單詞需要文件名補全。我們通過ArgumentCompleter將StringsCompleter和FileNameCompleter組合起來,以實現完整補全。


在實測中發現一個問題:當你輸入CREATE和文件名後,試圖進行補全,在第三個單詞處補全時,仍會出現文件名補全。這是因為ArgumentCompleter在使用完所有Completer後,默認使用最後一個Completer。為解決此問題,添加NullCompleter。這確保從第三個單詞開始,不會進行多餘的補全。


類似地,我們加入OPEN命令的補全定義。


動態補全


WRITE命令的補全需考慮程序語義。只有在OPEN命令中定義的文件變數,才能在WRITE命令中使用。因此,在補全時需要動態調整補全候選詞。在運行時修改補全候選詞,實現動態補全功能。通過繼承並重寫Completer類的complete()方法實現動態候選詞調整。


當調用setFileVars()方法時,會創建新的StringsCompleter並擴充候選詞。在REPL中,只需在用戶輸入OPEN命令後調用setFileVars()方法。


命令歷史


默認情況下,JLine3支持命令歷史查找功能。為了去除干擾,避免將注釋內容加入命令歷史,我們繼承並重寫History類的add()方法,過濾注釋內容。然後設置LineReader以實現此功能。


本文示常式序完整代碼見jline3-demo。


總結


JLine3功能設計清晰,提供了對應的介面和默認實現。若需自定義特性,通常可通過繼承並重寫實現。JLine3源代碼易於理解,遇到問題時,可閱讀源代碼尋找解決方案。

㈡ 有沒有開源的java製作的類似「百科」或者「維基」的組件

jspWiki 是一套非常容易安裝的系統,使用到JSP與Servlet技術。

DevWiki是一個把頁面存儲在CVS中的Wiki引擎。

Chiki 點擊次數:944
基於Struts的Wiki系統。

SnipSnap 是一個基於java的wiki + WebLog

FITNesse是一個 基於FIT的測試環境,. 它內建Wiki伺服器,簡單易用。

Friki部署簡單,非常小隻有67k

XWiki是一個強大的Java開源的Wiki引擎。它支持一些受歡迎的特性如:
* 內容管理(瀏覽/編輯/預覽/保存),
* 支持附件,
* 版本控制,
* 全文本搜索,
* 許可權管理
* 使用Hibernate進行數據存儲,
* RSS輸出與顯示外部的RSS feeds,
* 多語言支持,
* 提供XML/RPC的API,
* WYSIWYG HTML編輯器,
* 導出為PDF
* Groovy腳本支持等等....。

ButorWiki這是一個基於java的Wiki,它是一個web應用程序,使用Butor Java 框架與struts MVC 框架。ButorWiki不需要資料庫,而是使用文件系統進行數據存儲。

Very Quick Wiki是一個JSPs與JavaServlets開發的WikiWiki。在Tomcat或其它容器上安裝與運行都很簡單。

UseModj這個Wiki引薦運用到Struts框架與Velocity模板。它具有一些新的特性:多語言支持,支持RSS 1.0(rdf),文件/圖片的上傳與下載,圖片大小調整,可以用多種語言命名文件/圖片

Platypus Wiki一個Semantic(語義的) Wiki Wiki Web.它提供一個簡單的使用基於W3C標准元數據(metadata)的用戶介面來創建Wiki頁面.Platypus Wiki使用RDF(Resource Description Framework:資源描述框架),RDF Schema和OWL(Web Ontology Language:Web實體語言)來創建實體(Ontology)與管理元數據.

CsaWiki是一個利用Java開發的wiki引擎。它具有以下特點:100%Java(J2EE沒有EJB),基於文件沒有資料庫,版本控制,PDF導出,簡單的Wiki sintax等。

Elsie是一個用Java開發的Wiki引擎。它支持大多數流行wiki所應具備的特性包括:簡單的wiki markup語法,內容管理(查看, 編輯,附件等...), 版本控制,訪問控制列表和用戶/組管理,可使用布局模板和CSS來控制外觀,一個用於創建公共文檔的文檔模板,支持I18N和多種語言,搜索等. Elsie實現一個基於IoC的wiki內核並提供一組定義清晰,獨立於servlet的wiki API 以便於使整個Wiki易於擴展和可定製。

Corendal Wiki是一個開源並已經被實際公司所使用的Wiki應用軟體。它的界面非常簡潔;不需要學習wiki語法, 通過使用WYSIWYG在線編輯器來代替;不需要用戶管理,它實時連到活動目錄(Active Directory)來重復使用用戶賬號和組,它應該是唯一一個與活動目錄組相集成的Wiki,本地賬號和組都可以用它來創建;所有的文章都具有一個層次結構,以使得內容易於管理;可以針對每一個頁面設置不同的訪問許可權或自由更新或鎖定或發布;用戶可以使用訂閱機制來獲得更新通知,更新可以是每天或每周或立即通知;可以自定義界面布局(使用Velocity模板和CSS實現) 。Corendal Wiki基於Tomcat和MySQL運行。

JAMWiki採用Java/JSP開發的Wiki引擎。它提供許多MediaWiki應具有大部份的功能。JAMWiki不需要資料庫支持,數據採用文件系統存儲(但)並且易於安裝。

㈢ java解決邏輯問題-》「Zebra Puzzle」 http://en.wikipedia.org/wiki/Zebra_puzzle

本來以為是很簡單的,沒想到越寫越僵了...總之,我的思路就是不斷的嘗試,遇到發生矛盾的話就回溯,直到所有的條件都滿足,下面貼的代碼在main方法中調用ZebraPuzzle的方法創建題目中的條件,最後列印出推導出來的表格,有了表格就什麼信息都有了。當然可能還有(幾乎是肯定有)很多漏洞,因為一個測試例子是不足以檢測所有邏輯的。。。另外這里也沒有包括糾錯的邏輯,比如如果題目本身是矛盾的話,我就不知道會發生什麼了。。。

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class Test {

public static void main(String[] args) {
String[] attributeName =
{ "Color", "Nationality", "Drink", "Cigarette", "Pet" };
ZebraPuzzle puzzle = new ZebraPuzzle(5, attributeName);

puzzle.bindCondition("Nationality", "ENG", "Color", "Red");
puzzle.bindCondition("Nationality", "ESP", "Pet", "Dog");
puzzle.bindCondition("Drink", "Coffee", "Color", "Green");
puzzle.bindCondition("Nationality", "UKR", "Drink", "Tea");
puzzle.bindNeighbour("Color", "Ivory", "Color", "Green", true);
puzzle.bindCondition("Cigarette", "OldGold", "Pet", "Snail");
puzzle.bindCondition("Cigarette", "Kool", "Color", "Yellow");
puzzle.bindOrdinal("Drink", "Milk", 3);
puzzle.bindOrdinal("Nationality", "NOW", 1);
puzzle.bindNeighbour("Cigarette", "Chester", "Pet", "Fox", false);
puzzle.bindNeighbour("Cigarette", "Kool", "Pet", "Horse", false);
puzzle.bindCondition("Cigarette", "Lucky", "Drink", "Juice");
puzzle.bindCondition("Nationality", "JPN", "Cigarette", "Parliament");
puzzle.bindNeighbour("Nationality", "NOW", "Color", "Blue", false);

boolean result = puzzle.solve();
System.out.println(result);
puzzle.printTable();

}

}

class ZebraPuzzle {

private List<Fact> conditions;
private String[] attributes;
private Unit[] units;

public ZebraPuzzle(int n, String[] attrs) {
attributes = attrs;
conditions = new ArrayList<Fact>();
units = new Unit[n];
for (int i = 0; i < n; ++i) {
units[i] = new Unit(i+1, attributes);
}
}

public void bindCondition(String type1, String attr1, String type2, String attr2) {
conditions.add(new BinderFact(type1, attr1, type2, attr2));
}

public void bindNeighbour(String type1, String attr1, String type2,
String attr2, boolean sideSensitive) {
if (sideSensitive) {
conditions.add(new SideSensitiveNeighbourFact(type1, attr1, type2, attr2));
} else {
conditions.add(new NeighbourFact(type1, attr1, type2, attr2));
}
}

public void bindOrdinal(String type, String attr, int ordinal) {
conditions.add(new OrdinalFact(type, attr, ordinal));
}

public boolean solve() {
applyOrdinalFact();
applyDeterministicFactor();
return solve(0);
}

private boolean solve(int depth) {
if (depth == conditions.size()) {
return true;
}
Fact fact = conditions.get(depth);
List<PossibleFact> possibles = fact.getPossibleFacts(units);
if (possibles.size() == 0) {
return false;
}
for (PossibleFact pf : possibles) {
pf.apply(units);
if (solve(depth + 1)) {
return true;
}
pf.cancel(units);
}
return false;
}

private void directApply(OrdinalFact fact) {
units[fact.ordinal-1].setOrdinalFact(fact);
}

private void applyOrdinalFact() {
Iterator<Fact> iter = conditions.iterator();
while (iter.hasNext()) {
Fact fact = iter.next();
if (fact instanceof OrdinalFact) {
directApply((OrdinalFact) fact);
iter.remove();
}
}
}

private void applyDeterministicFactor() {
boolean modified;
while (!conditions.isEmpty()) {
modified = false;
Iterator<Fact> iter = conditions.iterator();
while (iter.hasNext()) {
Fact fact = iter.next();
if (fact.tryApply(units)) {
iter.remove();
modified = true;
}
}
if (!modified) {
break;
}
}
}

public void printTable() {
System.out.print("\t\t");
for (String attribute : attributes) {
System.out.printf("%s\t\t", attribute);
}
System.out.print("\n");
for (Unit unit : units) {
System.out.printf("%d\t\t", unit.ordinal);
for (String attribute : attributes) {
System.out.printf("%s\t\t", unit.getAttribute(attribute));
}
System.out.print("\n");
}
System.out.println();
}

}

enum AttributeState { UNKNOWN, DIFFERENT, SELF }

class Unit {

Unit(int ordinal, String[] attributes) {
this.ordinal = ordinal;
map = new HashMap<String, String>();
for (String attr : attributes) {
map.put(attr, Fact.UNKNOWN);
}
}

void setOrdinalFact(OrdinalFact fact) {
map.put(fact.type, fact.attribute);
}

void setAttribute(String type, String attribute) {
map.put(type, attribute);
}

boolean containsAttribute(String type, String attribute) {
return attribute.equals(map.get(type));
}

boolean containsDifferentOne(String type, String attribute) {
String s = map.get(type);
return s != Fact.UNKNOWN && !s.equals(attribute);
}

AttributeState consultAttribute(String type, String attribute) {
String s = map.get(type);
if (s == Fact.UNKNOWN) {
return AttributeState.UNKNOWN;
}
if (s.equals(attribute)) {
return AttributeState.SELF;
}
return AttributeState.DIFFERENT;
}

Unit getRightUnit(Unit[] units) {
if (ordinal == units.length) {
return null;
}
return units[ordinal];
}

String getAttribute(String attributeName) {
return map.get(attributeName);
}

Map<String, String> map;
int ordinal;

}

interface Fact {
static final String UNKNOWN = "Unknown";
public List<PossibleFact> getPossibleFacts(Unit[] units);
public boolean tryApply(Unit[] units);
}

interface PossibleFact {
public void apply(Unit[] units);
public void cancel(Unit[] units);
}

abstract class AbstractFact implements Fact {
public boolean tryApply(Unit[] units) {
return false;
}

protected Unit findOwner(Unit[] units, String type, String attribute) {
for (Unit unit : units) {
if (unit.containsAttribute(type, attribute)) {
return unit;
}
}
return null;
}

public List<PossibleFact> getPossibleFacts(Unit[] units) {
return Collections.emptyList();
}
}

class BinderFact extends AbstractFact {
String type1, attribute1;
String type2, attribute2;

BinderFact(String t1, String attr1, String t2, String attr2) {
type1 = t1;
attribute1 = attr1;
type2 = t2;
attribute2 = attr2;
}

public boolean tryApply(Unit[] units) {
Unit unit = super.findOwner(units, type1, attribute1);
if (unit != null) {
return tryApply(unit, type2, attribute2);
}
unit = super.findOwner(units, type2, attribute2);
if (unit != null) {
return tryApply(unit, type1, attribute1);
}
return false;
}

protected boolean tryApply(Unit unit, String type, String attribute) {
if (unit.containsDifferentOne(type, attribute)) {
throw new RuntimeException();
}
unit.setAttribute(type, attribute);
return true;
}

public List<PossibleFact> getPossibleFacts(Unit[] units) {
List<PossibleFact> list = new ArrayList<PossibleFact>();
for (Unit unit : units) {
AttributeState as1 = unit.consultAttribute(type1, attribute1), as2 = unit.consultAttribute(type2, attribute2);
if (as1 != AttributeState.DIFFERENT && as2 != AttributeState.DIFFERENT) {
list.add(new PossiblebBinderFact(unit.ordinal, this,
as1 == AttributeState.UNKNOWN,
as2 == AttributeState.UNKNOWN
));
}

}
return list;
}

private static class PossiblebBinderFact implements PossibleFact {
BinderFact fact;
boolean firstNew, secondNew;
int n;
PossiblebBinderFact(int n, BinderFact fact, boolean fn, boolean sn) {
this.fact = fact;
firstNew = fn;
secondNew = sn;
this.n = n;
}
public void apply(Unit[] units) {
if (firstNew) {
units[n-1].setAttribute(fact.type1, fact.attribute1);
}
if (secondNew) {
units[n-1].setAttribute(fact.type2, fact.attribute2);
}
}

public void cancel(Unit[] units) {
if (firstNew) {
units[n-1].setAttribute(fact.type1, Fact.UNKNOWN);
}
if (secondNew) {
units[n-1].setAttribute(fact.type2, Fact.UNKNOWN);
}
}

}
}

class NeighbourFact extends BinderFact {

NeighbourFact(String t1, String attr1, String t2, String attr2) {
super(t1, attr1, t2, attr2);
}

public boolean tryApply(Unit[] units) {
if (tryApply(units, type1, attribute1, type2, attribute2)) {
return true;
}
if (tryApply(units, type2, attribute2, type1, attribute1)) {
return true;
}
return false;
}

protected boolean tryApply(Unit[] units, String t1, String attr1,
String t2, String attr2) {
Unit unit = super.findOwner(units, t1, attr1);
if (unit == null) {
return false;
}
Unit right = unit.getRightUnit(units);
if (right == null) {
return false;
}
return super.tryApply(right, t2, attr2);
}

public List<PossibleFact> getPossibleFacts(Unit[] units) {
List<PossibleFact> list = new ArrayList<PossibleFact>();
getPossibleFacts(units, list, type1, attribute1, type2, attribute2);
getPossibleFacts(units, list, type2, attribute2, type1, attribute1);
return list;
}

protected void getPossibleFacts(Unit[] units, List<PossibleFact> list,
String t1, String attr1, String t2, String attr2) {
for (int i = 0; i < units.length - 1; ++i) {
Unit unit1 = units[i], unit2 = units[i + 1];
AttributeState as1 = unit1.consultAttribute(t1, attr1), as2 = unit2.consultAttribute(t2, attr2);
if (as1 != AttributeState.DIFFERENT && as2 != AttributeState.DIFFERENT) {
list.add(new PossibleNeighbourFact(t1, attr1, t2, attr2,
i, i+1, as1 == AttributeState.UNKNOWN,
as2 == AttributeState.UNKNOWN
));
}
}
}

private static class PossibleNeighbourFact implements PossibleFact {
String type1, attribute1, type2, attribute2;
boolean firstNew, secondNew;
int n1, n2;

PossibleNeighbourFact(String t1, String a1, String t2, String a2,
int n1, int n2, boolean fn, boolean sn) {
type1 = t1;
attribute1 = a1;
type2 = t2;
attribute2 = a2;
firstNew = fn;
secondNew = sn;
this.n1 = n1;
this.n2 = n2;
}
public void apply(Unit[] units) {
if (firstNew) {
units[n1].setAttribute(type1, attribute1);
}
if (secondNew) {
units[n2].setAttribute(type2, attribute2);
}
}

public void cancel(Unit[] units) {
if (firstNew) {
units[n1].setAttribute(type1, Fact.UNKNOWN);
}
if (secondNew) {
units[n2].setAttribute(type2, Fact.UNKNOWN);
}
}

}

}

class SideSensitiveNeighbourFact extends NeighbourFact {

SideSensitiveNeighbourFact(String t1, String attr1, String t2, String attr2) {
super(t1, attr1, t2, attr2);
}

public boolean tryApply(Unit[] units) {
return super.tryApply(units, type1, attribute1, type2, attribute2);
}

public List<PossibleFact> getPossibleFacts(Unit[] units) {
List<PossibleFact> list = new ArrayList<PossibleFact>();
getPossibleFacts(units, list, type1, attribute1, type2, attribute2);
return list;
}

}

class OrdinalFact extends AbstractFact {
String type, attribute;
int ordinal;

OrdinalFact(String t, String attr, int ord) {
type = t;
attribute = attr;
ordinal = ord;
}

}

㈣ 請問有沒有好些的java編寫的開源論壇代碼,最好是近期的產品

mvnForum

mvnForum是基於javaJ2EE 技術(Jsp/Servlet)的一個開源論壇.,安裝簡單。mvnForum兼容任何Servlet容器,支持Jsp 1.2 and Servlet 2.3。
更多mvnForum信息

JForum

JForum 是一個功能強大 ,易於管理的論壇。它的設計完全遵從MVC設計模式,能夠在任何Servlet容器與EJB伺服器上運行。而且可以輕松的定製與擴展JForum論壇。
更多JForum信息

xforum

國人開發的一個開源論壇,基於 Struts 技術,是學習 Struts 的一個非常好的範例。它用到 JAAS 實現 Security ,中文問題的解決,數據層用到 DAO ,以及基於 Struts 應用的基本架構,都是個非常好的學習。
更多xforum信息

jGossip

jGossip是一個簡單,功能強大的java論壇。可運用j2EE在平台上。採用Struts framework技術。
更多jGossip信息

FreeForums

一個基於XML的Java2企業級的論壇解決方案。FreeForums頁面採用CSS, DHTML 與JavaScript等技術。這樣用戶可以定製自已喜歡的界面。它還提供一個在Windows下的客戶端程序。
更多FreeForums信息

Sk Forum

SK Forum是一個開源的基於web的J2EE論壇應用程序。它是一個功能比較齊全的系統,包括很多功能比如:投票,wiki,定時跟蹤,地址薄,好友薄以及其它一些小的功能。
更多Sk Forum信息

JsForum

JsForum是只用到jsp與Servlet技術的論壇,容易使用。具有一般論壇的功能。但是目前只能支持MYSQL資料庫。
更多JsForum信息

nemesis-forum

一個使用J2EE技術的論壇。它的功能包括用戶與用戶組許可權管理,支持i18n,內容過濾,綜合搜索引擎,支持多種資料庫。
更多nemesis-forum信息

Yazd

Yazd是一個使用JDBC連接資料庫的論壇。它的特性包括:
1.提供在線安裝和配置。
2.內容過濾(把Html代碼轉換成可顯示的文件,自定義關鍵字過濾列表,隱藏urls的實現路徑)。
3.集成Lucene1.3提供關鍵字搜索功能。
4.支持的資料庫包括:Oracle,MySQL,DB2,Microsoft SQLServer,Sybase,Interbase,Hypersonic SQL,Pointbase,Informix和Postgres
5.還有其它一些一個論壇應具備的基本功能。
這個論壇提供多語言支持其中包括簡體中文。
更多Yazd信息

JavaBB

JavaBB基於java技術的類似於phpbb的論壇。
更多JavaBB信息

JForumFusion

JForumFusion是一個Java開源論壇。它主要的一些功能包括常規論壇功能,文件附件上傳,個人信息,基於web的管理工具,UBBCode,和高性能的搜索引擎等。支持主流資料庫包括:Oracle, DB2, MySQL, PostgreSQL, Sybase, SAP DB, HypersonicSQL, Microsoft SQL Server...

更多JForumFusion信息

jzForum

這是一個利用Java開發的簡單論壇.以下列出它的幾點特性:
* 完全支持BBCode,
* 在新貼提交時利用AJAX技術提供無刷新頁面預覽功能.
* 利用lucene提供全文本搜索功能.
* 用戶可監控主題.
* 可以容易更改樣式(利用CSS幾乎沒有用到table).
* 安裝簡單只有一個war文件沒有資料庫(其實是內嵌hypersonic資料庫)但 也支持其它資料庫.
* 包括一個投票系統.
* jzForum還提供RSS閱讀功能並利用緩存技術提高整個論壇的速度.
更多jzForum信息

BBS-CS

天乙社區是一套基於JAVA技術的網路虛擬社區,採用了Hibernate+Spring+Struts的輕量級J2EE框架.
1、全文檢索:天乙社區6.0採用Lucene全文檢索,並支持完全國際化多語言的全文檢索。
2、MVC框架:天乙社區6.0繼續了5.x的Struts框架,但經過優化,WEB端更加簡潔高效。
3、集群支持:系統可以運行在集群上。
4、功能方面:大大加強了管理功能,用戶可以多樣化的定製系統的各項信息,包括用戶級別、封鎖IP、過濾字等等,論壇功能上主要增加了投票帖、上傳附件類型多樣、帖子中顯示用戶信息等等功能等。
更多BBS-CS信息

EasyJF

簡易java框架開源論壇系統擁有常用論壇系統的基本功能,集前台後台代碼為一體,支持UBB。該論壇系統使用基於OO的方法設計,採用多層B/S構架,資料庫持久層主要使用簡易資料庫開源框架EasyDBO,Web層使用EasyJWeb框架,java代碼與頁面完全分離,易擴展。
更多EasyJF信息

參見:http://www.open-open.com/09.htm

㈤ 如何安裝配置JIRA和CONFLUENCE WIKI

JIRA的安裝
1.java安裝和設置JAVA_HOME
首先下載到sun官網下載jdk-6u20-linux-i586.bin(版本根據實際決定)。linux下可以使用wget命令。由於url忘記了,詳細命令不寫了。由於我們的開發伺服器不在本地,我只能通過wget下載。(當然還有很多別的方法,見下文)我先把jdk-6u20-linux-i586.bin下載到/home/acm,然後執行sh自解壓腳本
sh jdk-6u20-linux-i586.bin
yes人家的相關條款。如果順利的話,當前目錄會多一個jdk1.6.0_20。將該目錄移動到/usr/local/,並改為名java。
設置環境變數JAVA_HOME
這一步有很多方法,修改各種配置文件中的一個。我採取的方法是
vi /etc/profile
在文件後面兩行加上
export JAVA_HOME=/usr/local/java
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export JIRA_HOME=/usr/local/jira/
後面一行加粗的是後面配置JIRA_HOME時候加上去的www.linuxidc.com(可選,因為JIRA本身有配置文件配置這個路徑)。
修改完了配置文件,echo $JAVA_HOME一下必定得到空值。因為配置文件還沒有生效,最簡單的方法是 source一下
source /etc/profile
這個時候echo $JAVA_HOME 就會圓滿了。
[root@dev ~]# echo $JAVA_HOME
/usr/local/java
不放心的話也可以驗證一下其他路徑。可以輸入
java -version
看看是否得到如下結果:
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Server VM (build 16.3-b01, mixed mode)
順便提一句,我之前在安裝CentOS時候,選安裝了gcj,
rpm -aq|grep gcj
出來一堆東東。效果給不了了,因為寫blog之前已經執行了如下命令
yum -y remove java-1.4*
刪除gcj,JIRA官網說僅有這個的話。JIRA是不會正常工作的,常常會發生一些莫名其妙的bug。為了避免一起混亂,我首先刪除之。

閱讀全文

與java的wiki相關的資料

熱點內容
抖音如何上直播網站 瀏覽:887
錄屏截圖大師保存的文件在哪裡 瀏覽:751
紅河谷第二個版本 瀏覽:895
c語言如何讓整型數據的商為小數 瀏覽:863
怎樣下東西不要密碼 瀏覽:320
小米手機拍照後文件名要怎麼設置 瀏覽:429
每年程序員就業形勢 瀏覽:425
安卓手機如何卸載程序 瀏覽:955
相機能用qq不能用 瀏覽:319
win10如何設置成xp配置文件 瀏覽:748
蘋果隔空傳遞以後文件在哪裡 瀏覽:927
打開ps顯示文件名無效 瀏覽:379
做推廣哪個網站靠譜 瀏覽:588
qq飛車如何綁定好友 瀏覽:873
php編程語言在哪裡 瀏覽:302
矢量文件有哪些格式 瀏覽:790
文書檔案長期保存的文件有哪些 瀏覽:945
如何把pdf文字復制粘貼到word文檔 瀏覽:507
勤哲價格qinzheapp 瀏覽:709
騰訊小說下載的文件在哪裡 瀏覽:106

友情鏈接