我试图将我的项目分成两个不同的 jar 。第一个是“核心”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
...
}
}
我面临几个问题:
cmdLineApp 没有thirdPartyX.jar,即使我有coreApp.jar。 (目前作为解决方法,我在 STS 中 CmdLineApp 的构建路径中添加 CoreApp 项目,而不是 lib 目录中的 coreApp.jar)
运行 main() 方法时,应用程序可以访问/查找 input.txt,但不能访问/查找 coreFile.txt。 (我不想将 coreFile.txt 放在 CmdLineApp 项目中,因为它仅严格在核心中使用)。
所以我的问题是如何让文件被拾取而不必编写/硬编码绝对路径。以及如何在这种项目结构中组织 jar 和第三方 jar。
拥有单独核心的原因是我也将开发基于网络的版本,其中我将利用 Controller 的核心服务方法。因此,命令行和基于 Web 的都将使用相同的核心代码。
最佳答案
- cmdLineApp doesn't have thirdPartyX.jar even I have coreApp.jar in it. ( For now as workaround instead of coreApp.jar in lib directory I am adding CoreApp project in the build path of CmdLineApp in STS)
大多数“专业”应用程序通过实例化自己的 ClassLoader
来处理此问题与相应的 CLASSPATH 设置。通常这是使用 URLClassLoader
完成的。他们将存储额外的 .jar
文件在 lib/
目录。您可以编写创建 URLClassLoader
的代码以某种方式它会拾取任何东西.jar
就在那lib/
目录,因此如果您添加、删除或重命名 .jar
则无需触及该代码文件。
如果.jar
文件是插件,您甚至可以拥有第二个 ClassLoader
与java.nio.file.WatchService
有关为了检测.jar
的变化运行时归档。
- When running main() method application can access/find input.txt but not coreFile.txt. (I don't wan to put coreFile.txt) in CmdLineApp project as it is strictly used in core only).
如果您只需要读取该文件,请将该文件作为资源放入 .jar 文件中并使用 getClass().getResourceAsStream()
或getClass().getResource()
访问该文件。请注意,它不再是 File
但是InputStream
或URL
,但如果您只读,这应该不重要。
如果您需要写入此文件,您可以采用之前的方法,将数据存储在可以使用 File.createTempFile()
创建的临时文件中。并使用 java.util.prefs.Preferences
记住路径.
关于java - 模块化Java应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27773243/