2017-05-24 112 views
-2

我已經在Java中創建了一個漂亮的音樂發生器thingy。代碼效率不高,但它確實運行。順便說一句,我正在使用BlueJ。 BlueJ有一個功能是創建一個可執行的jar文件,您可以在其中選擇要使用哪個類的主要方法,並將其編譯。我一直在我的計算機上獲取損壞的jar文件,當我將該程序交給朋友讓他做同樣的事情時,但點擊時jar文件不會執行任何操作。創建可執行jar文件的問題

程序引用項目文件夾中的音樂剪輯文件(.wav),但反編譯時的jar文件沒有它們。

它在控制檯中運行,我剛剛得知控制檯不能用於Jar文件。很公平。如果我將其更改爲JOptionPane以供用戶輸入,它會顯示出來嗎?我該如何包含聲音文件呢?

我看到一些關於使用控制檯的東西,但我無法訪問我的學校計算機。或者至少我不認爲我這樣做。我的最終目標是能夠運行一個jar文件並使其發揮作用。這樣,我可以在我的主計算機上運行我的chromebook上的jar文件。

編輯:如果你想看我的代碼,看看我是否有錯誤,該項目就在這裏。 https://drive.google.com/file/d/0B2a2yK5zF36HWHc0X1JzMU1ZRDA/view?usp=sharing

+4

誰說控制檯不能用jar文件?,你可以運行基於控制檯創建的應用程序Java在Linux,Windows或Mac OS上。現在嘗試一次提出一個問題。例如:如何使用BlueJ在我的Java項目中包含wav文件?或者如何在BlueJ中構建可執行的jar文件。確保你提到操作系統,你在學校使用什麼電腦?它在我看來你使用的是Rasp Berry Pi,但你沒有提到這一點。在Windows中,控制檯被稱爲命令提示符,在Linux和Mac OS中,他們稱之爲終端 – AbelSurace

+0

_If我將其更改爲JOptionPane以供用戶輸入,它會顯示嗎?_我不知道。你爲什麼不嘗試。 請將您的代碼發佈在問題中。謝謝! – CodingNinja

+0

我們使用的是我認爲是戴爾的Windows 10電腦。他們是大個人電腦,而不是筆記本電腦。 BlueJ可以用它們中的類創建jar文件,但是它省略了程序中使用的必要的.wav文件。我知道那是我需要解決的問題。我想知道,但如果控制檯(如system.out.println)是另一個問題,或者它只是造成它不工作的wav文件。 – JesusLopez

回答

0

我覺得你的問題可以在2分:一個你可能不包括在項目中的* .wav文件,確保創建jar文件時,您選擇的語音文件夾:

enter image description here

此外,由於應用程序不知道從哪個位置運行,所以此文件的路徑必須與您的jar文件的位置相關,我修改了您的主類代碼以更正此問題。它可以在我的電腦上運行,從windows命令窗口鍵入「java -jar juke.jar」或者任何你放入jar文件的名字。

Modifieed代碼:

/** 
* Made by Aaron Cohen 
*/ 

//http://introcs.cs.princeton.edu/java/assignments/mozart.html 
import java.util.Random; 
import java.util.Scanner; 
import java.io.File; 
import java.nio.file.*; 
import java.lang.StringBuilder; 

public class Main 
{ 
    public static String name; 
    public static String originalname; 
    public static void main (String[] args){ 
     Scanner scanny = new Scanner(System.in); 
     System.out.print("Want to hear your own personal waltz in the style of Mozart?\n"); 
     System.out.print("This is your own waltz bounded to your name. It is different from\n"); 
     System.out.print("anybody else's waltz. There are 1.3*10^29 different possible\n"); 
     System.out.println("possibilities and this is yours. Enter your name to proceed:\n"); 
     name = scanny.nextLine(); 
     originalname = name; 
     name = name.toLowerCase(); 
     System.out.println("\nHold on just a second while your piece is being generated..."); 
     String reversedname = new StringBuilder(name).reverse().toString(); 
     while(name.length() < 32){ 
      name += reversedname; 
      name += originalname; 
     } 
     char[] letters = name.toCharArray(); 
     int[] numbers = new int[32]; 
     for(int i = 0; i < 32; i++){ 
      numbers[i] = (int) letters[i] - 96; 
     } 
     /* 
     for(int i : numbers){ 
     System.out.println(i); 
     } 
     */ 
     int[][] minuet = new int[][]{ 
       { 96, 22, 141, 41, 105, 122, 11, 30, 70, 121, 26, 9, 112, 49, 109, 14 }, 
       { 32, 6, 128, 63, 146, 46, 134, 81, 117, 39, 126, 56, 174, 18, 116, 83}, 
       { 69, 95, 158, 13, 153, 55, 110, 24, 66, 139, 15, 132, 73, 58, 145, 79}, 
       { 40, 17, 113, 85, 161, 2, 159, 100, 90, 176, 7, 34, 67, 160, 52, 170}, 
       { 148, 74, 163, 45, 80, 97, 36, 107, 25, 143, 64, 125, 76, 136, 1, 93}, 
       { 104, 157, 27, 167, 154, 68, 118, 91, 138, 71, 150, 29, 101, 162, 23, 151}, 
       { 152, 60, 171, 53, 99, 133, 21, 127, 16, 155, 57, 175, 43, 168, 89, 172}, 
       { 119, 84, 114, 50, 140, 86, 169, 94, 120, 88, 48, 166, 51, 115, 72, 111}, 
       { 98, 142, 42, 156, 75, 129, 62, 123, 65, 77, 19, 82, 137, 38, 149, 8}, 
       { 3, 87, 165, 61, 135, 47, 147, 33, 102, 4, 31, 164, 144, 59, 173, 78}, 
       { 54, 130, 10, 103, 28, 37, 106, 5, 35, 20, 108, 92, 12, 124, 44, 131}, 
      }; 

     int[] chosenminuet = new int[16]; 

     int[][] trio = new int[][]{ 
       { 72, 6, 59, 25, 81, 41, 89, 13, 36, 5, 46, 79, 30, 95, 19, 66}, 
       { 56, 82, 42, 74, 14, 7, 26, 71, 76, 20, 64, 84, 8, 35, 47, 88}, 
       { 75, 39, 54, 1, 65, 43, 15, 80, 9, 34, 93, 48, 69, 58, 90, 21}, 
       { 40, 73, 16, 68, 29, 55, 2, 61, 22, 67, 49, 77, 57, 87, 33, 10}, 
       { 83, 3, 28, 53, 37, 17, 44, 70, 63, 85, 32, 96, 12, 23, 50, 91}, 
       { 18, 45, 62, 38, 4, 27, 52, 94, 11, 92, 24, 86, 51, 60, 78, 31}, 
      }; 

     int[] chosentrio = new int[16]; 
     for(int i = 0; i < 16; i++){ 
      Random randy = new Random(numbers[i]); 
      //System.out.println(randy.nextInt(11)+1); 
      chosenminuet[i] = minuet[randy.nextInt(11)][i]; 
     } 
     //print(chosenminuet); 
     WavAppender.splice("./AudioFiles/"+"M"+chosenminuet[0]+".wav","AudioFiles/"+"M"+chosenminuet[1]+".wav","./Temp/"+0+".wav"); 
     for(int i = 0; i<15; i++){ 
      WavAppender.splice("./Temp/"+(i)+".wav","./AudioFiles/"+"M"+chosenminuet[i+1]+".wav","./Temp/"+(i+1)+".wav"); 
     } 

     for(int i = 0; i < 16; i++){ 
      Random randy = new Random(numbers[i]*numbers[i]); 
      //System.out.println(randy.nextInt(11)+1); 
      chosentrio[i] = trio[randy.nextInt(6)][i]; 
     } 
     //print(chosentrio); 

     WavAppender.splice(".\\AudioFiles\\"+"T"+chosentrio[0]+".wav",".\\AudioFiles\\"+"T"+chosentrio[1]+".wav",".\\Temp\\"+16+".wav"); 
     for(int i = 16; i<31; i++){ 
      WavAppender.splice(".\\Temp\\"+(i)+".wav",".\\AudioFiles\"+"T"+chosentrio[i+1-16]+".wav",".\\Temp\\"+(i+1)+".wav"); 
     } 
     WavAppender.splice(".\\Temp\\15.wav",".\\Temp\\31.wav",".\\Temp\\Complete.wav"); 

     System.out.println("\nWould you like to save this piece? Enter true or false"); 
     JukeBox juke = new JukeBox(".\\Temp\\Complete.wav"); 
     juke.play(); 

     boolean trip = false; 
     boolean shouldSave = false; 
     while(!trip){ 
      try{ 
       Scanner yeet = new Scanner(System.in); 
       shouldSave = yeet.nextBoolean(); 
       trip = true; 
      } catch (Exception e){ 
       System.out.println("\fPlease enter true if you would like to save your piece.\nOr, enter false to end this session"); 
      } 
     } 

     if(shouldSave){ 
      File src = new File(".\\Temp\\Complete.wav"); 
      String Filename="..\\SavedAudio_"+originalname+".wav"; 
      File target = new File(Filename); 
      System.out.println("this is the path your saving to: "+ Filename); 

      try{ //https://stackoverflow.com/questions/106770/standard-concise-way-to-copy-a-file-in-java 
       Files.copy(src.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING); 
       System.out.println("File saved succesfully! Find it in the SavedAudio folder. See ya later"); 
      } catch (Exception e) {System.out.println("Copying failed. Try again or contact Aaron.\nThis is likely the result of you using any of the following characters in your name \\/: ? \" < > | ");} 
     } 
     else{ 
      System.out.println("\nSee ya!"); 
     } 

     //This tries to clear up some space but it does not always work. It tries to delete the temporary files. 
     for(int i = 0; i<31; i++){ 
      File file = new File(".\\Temp\\"+i+".wav"); 
      file.delete(); 
      //System.out.println(i+":"+file.delete()); 
     } 
    } 

    public static void print(int[] yeet){ 
     System.out.print("{"); 
     for(int x: yeet){ 
      System.out.print(x+", "); 
     } 
     System.out.println("}"); 
    } 
} 

看我怎麼把\\中的文件前,使這條道路相對的,現在要小心,在這個窗口只工作,對其它操作系統可能會有所不同,最好的方法是從資源中獲取url路徑,你應該能夠在堆棧溢出中找到來自其他答案

+0

這很奇怪。也許我將不得不聯繫我的學校關於更新BlueJ,因爲我知道我沒有選擇AudioFiles的選項。你還有什麼要做的嗎?或者是對代碼進行修改的結果? 另外,我對命令提示符「java -jar juke.jar」非常困惑。所以我在我的計算機上,在BlueJ中,我將華爾茲導出到一個名爲juke.jar的jar文件中。然後打開CMD並按照原樣鍵入它? juke.jar是否必須在任何特定的地方?或者是那裏需要的路徑?這對我來說是非常新的。 – JesusLopez

+0

我使用BlueJ版本4.0.1,也許你使用的是不同版本,BlueJ是免費的,你可以下載最新版本,有一個不需要安裝,你只需從文件夾中運行bluej.exe請訪問https://www.bluej.org/並選擇獨立窗口。我從使用選項打開的zip/jar共享的zip文件打開項目。 – AbelSurace

+0

現在對於命令是,您必須運行它位於與您的jar文件相同的路徑,例如c:\ yourdirectory> java -jar juke.jar。要轉到Windows左下角的搜索框中的cmd命令,請輸入cd yourdirectory,然後輸入命令,然後輸入jar文件所在的目錄鍵入java -jar juke.jar。如果您不明白我的指示,請向您的老師澄清,如果它適合您,請接受答案。乾杯! – AbelSurace

1

這個問題並不十分清楚(你實際得到了什麼錯誤?爲什麼不包括* .wavs?),所以你會冒風險讓問題關閉。 不過,我會盡力幫助你。

  • JAR文件是什麼,但包含編譯的類,資源(如您的* .wav文件)一個簡單的zip壓縮包,和一個特殊的MANIFEST.MF文件包含在罐子本身
  • 任何資源可以在使用代碼中,有關於這一專題的很多教程,但是,總之,所有你需要做的是:InputStream wav = this.getClass().getResourceAsStream("sample.wav");
  • 是的,你可以運行jar文件只是從一個命令行罰款:java -jar file.jar
  • 所有你需要通過做一個罐子可執行上面的命令或簡單的雙擊是清單中的Main-Class條目,事端g類似於:Main-Class: com.example.ClassWithMain
  • 是的,創建一個GUI應用程序可以工作,然後你的主要方法將負責創建窗口等,但是它不是GUI應用程序和可執行的jar之間的關係。執行jar只是意味着從清單中指定的類運行main方法。
  • 運行罐子的機器需要(至少)JRE安裝。如上所述,jar只是一個類的zip壓縮文件,而不是本地可執行文件。
+0

我已經在我的代碼中成功實現了聲音文件,但是當BlueJ製作Jar時,它們不包含在其中。就是這樣,並且Jar沒有打開,但我不確定這是爲什麼jar無法打開 – JesusLopez

+0

該項目是一個控制檯應用程序,因此雙擊該jar文件將不起作用,您必須打開命令提示符(鍵入cmd在窗口搜索右下角),然後移動到jar文件所在的文件夾「cd yourfolder」,您必須知道該路徑,然後從那裏輸入java - jar yourfilename.jar,將您的文件夾和yourfile更改爲您的大小寫。 – AbelSurace