2012-08-14 56 views
3

我在使用命令提示符使用自定義jar庫(algs4.jar/stdlib.jar從http://algs4.cs.princeton.edu/home/)時遇到問題。我將庫添加到了IntelliJ類路徑設置(項目結構 - > SDKs - >類路徑),並且能夠使用它們的類,而不會使用IntelliJ問題。在命令提示符和IntelliJ IDEA中使用自定義jar庫

但是,我也希望能夠在命令提示符下使用這些庫。即使我的Windows設置中沒有設置CLASSPATH變量,我仍然可以在cmd中使用javac/java,而在使用標準java庫時沒有任何問題。 (可能是因爲IntelliJ爲每個啓動/編譯中的所有標準庫設置CLASSPATH以在系統範圍內工作)。但是,即使在將2個罐添加到IntelliJ類路徑設置後,我也無法在cmd中使用「javac」。然後,我在Windows設置中創建了CLASSPATH變量,並向它們添加了罐子。在此之後,我可以用javac進行編譯而不會出現任何問題。但是,當我嘗試在cmd中運行該程序時,得到以下代碼:

「錯誤:無法找到或加載主類」。

無論何時使用任何包含標準庫的jar庫,在設置Windows CLASSPATH之前沒有問題,我都會收到此錯誤。我猜想一旦我設置了自己的CLASSPATH,會覆蓋由intelliJ設置的類路徑。當我刪除CLASSPATH時,我再次能夠在cmd中編譯和運行標準庫,但不能在2個自定義庫中運行。

請幫忙!

回答

6
+0

我跟着[「創建模塊庫和添加它來模塊依賴關係」份](HTTP:// www.jetbrains.com/idea/webhelp/configuring-module-dependencies-and-libraries.html)與IntelliJ IDEA 12 Mac。如果我嘗試使用jar中定義的類,它會警告「無法解析符號'XXX'」。任何想法?這與我認爲我並不試圖導出項目的「工件」無關。 – qazwsx 2014-03-27 03:47:14

1

作爲this post points out,在這種特殊情況下,問題可能是由於庫中的類是「...放置在默認包(無包語句)」和現代版本的Java(至少7和8)禁止引用默認包中的類,除非你自己的類也是默認包。「

爲了解決這個問題,我從jar文件中提取了.java文件(將文件類型從.jar改爲.zip並解壓縮到一個目錄)。我創建了一個包名稱「com.sedge.stdlib」,並根據需要修改了.java文件。例如,我通過在頂部放置一個package指令修改從algs4的StdLib.java類:

package com.sedge.stdlib; 

import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.UnsupportedEncodingException; 
import java.util.Locale; 

/** 
* <i>Standard output</i>. This class provides methods for writing strings 
* and numbers to standard output. 
* <p> 
* For additional documentation, see <a href="http://introcs.cs.princeton.edu/15inout">Section 1.5</a> of 
* <i>Introduction to Programming in Java: An Interdisciplinary Approach</i> by Robert Sedgewick and Kevin Wayne. 
* 
* @author Robert Sedgewick 
* @author Kevin Wayne 
*/ 
public final class StdOut { 
. . . 
+0

你是如何從他們創建一個新的jar文件的?這只是重新編譯所有.java文件的問題嗎? META-INF和罐子裏的其他東西呢? – David 2015-06-10 00:25:22

+0

爲了我的目的,我很滿意在項目中擁有代碼本身。創建JAR將非常簡單。 META-INF的MANIFEST.MF文件很簡單;它的內容包括: ' 清單-版本:1.0 創建-者:1.7.0_75公司(Oracle Corporation) ' 你的開發環境會產生相當類似的清單,我想。 – Bex 2015-06-11 16:13:57

+0

發佈該問題後,我發現我可以使用JetBrains IDEA「從現有源創建項目」,然後使用「構建工件」。實際上,我已經將整個sedgewick庫轉換爲Java 1.8和jogl 2。0等。 – David 2015-06-11 20:01:04