模块化Java应用程序

时间:2015-01-05 04:04:05

标签: java eclipse maven jar decoupling

我正在尝试将我的项目分成两个不同的罐子。第一个将是具有所有业务逻辑的“核心”jar。第二个是用于将使用核心的命令提示符版本。以下是包含内容和代码段的项目结构。

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.txt。 (我不想把coreFile.txt放在CmdLineApp项目中,因为它只在核心中使用)。

  3. 所以我的问题是如何在不必编写/硬编码绝对路径的情况下使文件被拾取。在这种项目结构中,我如何组织罐子和第三方罐子。

    拥有单独核心的原因是我也将开发基于Web的版本,我将使用来自控制器的核心服务方法。因此cmd line和web都将使用相同的核心代码。

1 个答案:

答案 0 :(得分:2)

  
      
  1. cmdLineApp没有thirdPartyX.jar,即使我有coreApp.jar。 (现在作为解决方法而不是lib目录中的coreApp.jar,我在STS中的CmdLineApp的构建路径中添加了CoreApp项目)
  2.   

大多数“Pro”应用程序通过使用相应的CLASSPATH设置实例化自己的ClassLoader来处理此问题。通常这是使用URLClassLoader完成的。他们会将其他.jar存档存储在lib/目录中。您可以编写创建URLClassLoader的代码,以便它获取.jar目录中的lib/内容,以便在添加,删除或删除时不需要触摸该代码重命名.jar个文件。

如果.jar文件是插件,您甚至可以使用与ClassLoader相关的第二个java.nio.file.WatchService,以便检测.jar的更改档案在运行时。

  
      
  1. 运行main()方法时,应用程序可以访问/查找input.txt但不能访问coreFile.txt。 (我不想把coreFile.txt放在CmdLineApp项目中,因为它只在核心中使用)。
  2.   

如果您只需要读取该文件,请将该文件作为资源放在.jar文件中,并使用getClass().getResourceAsStream()getClass().getResource()来访问该文件。请注意,它不再是File而是InputStreamURL,但如果您只读,则无关紧要。

如果您需要写入此文件,您可以选择以前的方法,将数据存储在您可以使用File.createTempFile()创建的临时文件中,并使用java.util.prefs.Preferences记住路径。