能否通过模板生成含Maven依赖类路径的启动Shell脚本?
Maven生成自定义启动脚本方案
方法一:结合maven-dependency-plugin与maven-resources-plugin实现模板替换
这种方式可以直接让Maven帮你把类路径替换到模板中,无需手动维护cp.txt:
- 创建启动脚本模板
在src/main/resources下新建start.sh.template文件,内容如下:
#!/bin/sh exec java -cp @project.classpath@:MyOwn.jar MyOwn "$@"
这里用@project.classpath@作为类路径的占位符,避免和Maven自身变量冲突。
- 配置maven-dependency-plugin生成类路径属性
在pom.xml中添加插件配置,将依赖类路径存入Maven属性project.classpath:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>build-classpath-property</id> <phase>generate-resources</phase> <goals> <goal>build-classpath</goal> </goals> <configuration> <outputProperty>project.classpath</outputProperty> <!-- Linux/macOS用冒号,Windows用分号,可通过Maven Profile区分环境 --> <pathSeparator>:</pathSeparator> </configuration> </execution> </executions> </plugin>
- 配置maven-resources-plugin替换模板占位符
让Maven处理模板文件,把占位符替换成实际的类路径,并输出到构建目录:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>process-script-template</id> <phase>generate-resources</phase> <goals> <goal>resources</goal> </goals> <configuration> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>start.sh.template</include> </includes> <filtering>true</filtering> <!-- 指定占位符分隔符为@ --> <delimiters> <delimiter>@</delimiter> </delimiters> </resource> </resources> <outputDirectory>${project.build.directory}/scripts</outputDirectory> </configuration> </execution> </executions> </plugin>
- 自动添加执行权限(可选)
用maven-antrun-plugin给生成的脚本添加可执行权限,避免手动操作:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>make-script-executable</id> <phase>generate-resources</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <chmod file="${project.build.directory}/scripts/start.sh" perm="755"/> </tasks> </configuration> </execution> </executions> </plugin>
执行mvn generate-resources后,就能在target/scripts目录下得到最终的启动脚本start.sh,直接运行即可。
方法二:使用maven-assembly-plugin打包时生成脚本
如果你需要在打包阶段同时生成启动脚本,可以用assembly插件的模板功能:
- 创建assembly描述文件
在src/main/assembly下新建script-assembly.xml:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> <id>script</id> <formats> <format>dir</format> </formats> <files> <file> <source>src/main/resources/start.sh.template</source> <outputDirectory>/</outputDirectory> <destName>start.sh</destName> <filtered>true</filtered> </file> <file> <source>${project.build.directory}/${project.build.finalName}.jar</source> <outputDirectory>/</outputDirectory> </file> </files> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <useProjectArtifact>false</useProjectArtifact> </dependencySet> </dependencySets> </assembly>
- 配置maven-assembly-plugin
在pom.xml中添加插件,结合dependency-plugin生成的类路径属性,替换模板中的占位符:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>create-script-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>src/main/assembly/script-assembly.xml</descriptor> </descriptors> <filters> <filter> <property>project.classpath</property> <value>${project.classpath}</value> </filter> </filters> </configuration> </execution> </executions> </plugin>
注意这里需要确保dependency-plugin已经先生成了project.classpath属性。
执行mvn package后,会在target目录下生成包含启动脚本、自身JAR和依赖JAR的目录,脚本中的类路径已经替换完成。
内容的提问来源于stack exchange,提问作者Mikhail T.
相关产品推荐
相关产品推荐

