模块化 Java 应用程序
Modular Java Application
我正在尝试将我的项目分成两个不同的 jar。第一个是 'core' 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。 (现在作为解决方法而不是 lib 目录中的 coreApp.jar 我在 STS 中的 CmdLineApp 的构建路径中添加 CoreApp 项目)
运行 main() 方法时应用程序可以 access/find input.txt 但不能 coreFile.txt。 (我不想将 coreFile.txt)放在 CmdLineApp 项目中,因为它仅在核心中严格使用)。
所以我的问题是如何在不对绝对路径进行 write/hard 编码的情况下获取文件。以及我如何在这种项目结构中组织 jar 和第三方 jar。
拥有独立核心的原因是我也将开发基于网络的版本,我将在其中使用来自控制器的核心服务方法。因此,cmd 行和基于 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)
大多数 "Pro" 应用程序通过使用相应的 CLASSPATH 设置实例化它们自己的 ClassLoader
来处理这个问题。通常这是使用 URLClassLoader
完成的。他们会将额外的 .jar
档案存储在 lib/
目录中。您可以编写创建 URLClassLoader
的代码,使其获取 lib/
目录中的任何 .jar
,因此如果您添加、删除或重命名 .jar
个文件。
如果 .jar
文件是插件,您甚至可以将第二个 ClassLoader
与 java.nio.file.WatchService
连接起来,以检测对 [=12] 的更改=] 在运行时存档。
- 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
记住路径。
我正在尝试将我的项目分成两个不同的 jar。第一个是 'core' 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。 (现在作为解决方法而不是 lib 目录中的 coreApp.jar 我在 STS 中的 CmdLineApp 的构建路径中添加 CoreApp 项目)
运行 main() 方法时应用程序可以 access/find input.txt 但不能 coreFile.txt。 (我不想将 coreFile.txt)放在 CmdLineApp 项目中,因为它仅在核心中严格使用)。
所以我的问题是如何在不对绝对路径进行 write/hard 编码的情况下获取文件。以及我如何在这种项目结构中组织 jar 和第三方 jar。
拥有独立核心的原因是我也将开发基于网络的版本,我将在其中使用来自控制器的核心服务方法。因此,cmd 行和基于 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)
大多数 "Pro" 应用程序通过使用相应的 CLASSPATH 设置实例化它们自己的 ClassLoader
来处理这个问题。通常这是使用 URLClassLoader
完成的。他们会将额外的 .jar
档案存储在 lib/
目录中。您可以编写创建 URLClassLoader
的代码,使其获取 lib/
目录中的任何 .jar
,因此如果您添加、删除或重命名 .jar
个文件。
如果 .jar
文件是插件,您甚至可以将第二个 ClassLoader
与 java.nio.file.WatchService
连接起来,以检测对 [=12] 的更改=] 在运行时存档。
- 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
记住路径。