Java如何将JAR包生成到源码、资源所在目录外的指定文件夹
操作方法
所有操作基于你给出的目录结构基准:
项目根目录 ├─ f1 │ └─ ft1 │ └─ ft2 │ └─ ft3 # Java源码存放路径 └─ f2 ├─ ft1 # 依赖CSV文件存放路径 └─ ft2 # JAR目标输出路径
根据你使用的打包方式不同,对应操作如下:
1. 无构建工具,直接命令行打包
- 先进入源码所在目录,编译时把CSV依赖路径加入classpath,避免资源找不到:
cd f1/ft1/ft2/ft3 javac -cp ../../../../f2/ft1 *.java
- 执行jar打包命令时,直接指定输出文件的完整路径为f2/ft2下的目标文件即可,不需要把JAR生成在源码目录再手动移动:
jar cvfe ../../../../f2/ft2/your-app.jar 你的主类全类名 *.class
路径说明:上述命令里的相对路径是从当前所在的ft3目录计算的,你也可以直接填f2/ft2的绝对路径,不会出现路径匹配错误。如果不需要把CSV打进JAR,后续启动JAR时把f2/ft1加入classpath即可正常读取依赖文件。
2. Maven项目打包
直接修改项目根目录下的pom.xml,在build配置块中指定构建输出目录为目标路径,执行打包命令后JAR会自动输出到对应位置,不需要额外操作:
<build> <!-- 直接指定构建输出的根目录为f2/ft2,路径可写相对路径或绝对路径 --> <directory>../../f2/ft2</directory> <finalName>your-app</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>你的主类全类名</mainClass> </manifest> </archive> <!-- 可选:如果要把f2/ft1下的CSV文件打进JAR,添加以下资源配置 --> <resources> <resource> <directory>../../../f2/ft1</directory> <includes> <include>*.csv</include> </includes> </resource> </resources> </configuration> </plugin> </plugins> </build>
配置完成后正常执行mvn clean package,生成的JAR就会直接存放在f2/ft2路径下,不会出现在f1的源码目录树中。
3. Gradle项目打包
修改项目下的build.gradle文件,在jar任务配置中直接指定输出目录:
jar { // 指定JAR输出到f2/ft2路径,支持相对路径/绝对路径 destinationDirectory = file("${rootDir}/../../f2/ft2") archiveFileName = "your-app.jar" manifest { attributes 'Main-Class': '你的主类全类名' } // 可选:如果要把f2/ft1下的CSV打进JAR,添加以下配置 from("${rootDir}/../../f2/ft1") { include "*.csv" } }
配置完成后执行gradle jar,生成的JAR会直接输出到目标路径。
运行注意:如果没有把CSV打进JAR,启动时需要把f2/ft1加入classpath才能正常读取依赖,启动命令参考:
java -cp f2/ft2/your-app.jar:f2/ft1 你的主类全类名
内容的提问来源于stack exchange,提问作者Shivi Singla
相关产品推荐
相关产品推荐

