2015-01-05 64 views
0

我想將我的項目分成兩個不同的罐子。第一個將是具有所有業務邏輯的'核心'罐子。第二個是使用核心的命令提示符版本。以下是包含內容和代碼片段的項目結構。模塊化Java應用程序

CoreApp項目結構

CoreApp 
    - src 
    - com.myapp.service 
     - CoreService.java 
    - lib 
    - thirdPartyX.jar 
    - coreFile.txt 

的CmdLine項目結構

CmdLineApp 
    - src 
    - com.myapp.main 
     - MainClass.java 
    - lib 
    - thirdPartyY.jar 
    - coreApp.jar 
    - input.txt 

MainClass.java

public class MainClass { 
    pulic static void main(String[] args) { 
    File inputFile = new File("input.txt"); //OK 
    ... 
    coreService.doSomething(); //ERROR 
    } 
} 

CoreService.java

public class CoreService { 
    public void doSomething() { 
    File coreFile = new File("coreFile.txt"); //NOT OK 
    ... 
    } 
} 

而且我現在面臨幾個問題:

  1. cmdLineApp沒有thirdPartyX.jar連我都coreApp.jar在裏面。 (現在作爲替代lib目錄中的coreApp.jar的解決方法,我在STS中的CmdLineApp的構建路徑中添加CoreApp項目)

  2. 當運行main()方法應用程序可以訪問/查找input.txt但不是coreFile。文本。 (我不想放置coreFile.txt)在CmdLineApp項目中,因爲它僅在覈心中使用)。

所以我的問題是我如何使文件被拾取而不必寫/硬編碼的絕對路徑。在這種類型的項目結構中,我怎樣才能將jar與第三方jar一起組織起來。

分離核心的原因是我也會開發基於web的版本,其中我將利用控制器的核心服務方法。因此,cmd行和基於Web的將使用相同的核心代碼。

回答

2
  1. cmdLineApp沒有thirdPartyX.jar連我都coreApp.jar在裏面。 (現在的解決辦法,而不是coreApp.jar在lib目錄我加入的CmdLineApp的STS構建路徑CoreApp項目)

最「專業」的應用程序處理這個實例化自己ClassLoader與相應的CLASSPATH設置。通常這是使用URLClassLoader完成的。他們會將額外的.jar檔案存儲在lib/目錄中。您可以編寫創建URLClassLoader的代碼,使其可以在lib/目錄中找到.jar,因此如果您添加,刪除或重命名.jar文件,則無需觸摸該代碼。

如果.jar文件的插件,你甚至可以去儘可能在爲了在運行時檢測更改.jar檔案與java.nio.file.WatchService連接具有第二ClassLoader

  • 當運行main()方法的應用可訪問/找到input.txt中但不coreFile.txt。 (我不想放置coreFile.txt)在CmdLineApp項目中,因爲它僅在覈心中使用)。
  • 如果你永遠只能需要讀取該文件,該文件將作爲.jar文件內的資源,並使用getClass().getResourceAsStream()getClass().getResource()訪問文件。請注意,它不再是File,而是InputStreamURL,但如果您只是閱讀,則無關緊要。

    如果您需要寫入此文件,則需要採用先前的方法,將數據存儲在可使用File.createTempFile()創建的臨時文件中,並記住使用java.util.prefs.Preferences的路徑。

    +0

    使用URLClassLoader加載* .jar和文件的代碼應該位於CoreApp或CmdLine項目中? –

    +0

    這取決於。如果你的CmdLine加載你的CoreApp和CoreApp會加載重置,那麼這兩個代碼都會有這樣的代碼。 –

    +0

    - 我不確定'reset'是什麼意思,但是CmdLine只會使用MainClass.java中顯示的服務 –