2015-01-05 62 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中显示的服务 –