You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过模板生成含Maven依赖类路径的启动Shell脚本?

Maven生成自定义启动脚本方案

方法一:结合maven-dependency-plugin与maven-resources-plugin实现模板替换

这种方式可以直接让Maven帮你把类路径替换到模板中,无需手动维护cp.txt:

  1. 创建启动脚本模板
    在src/main/resources下新建start.sh.template文件,内容如下:
#!/bin/sh
exec java -cp @project.classpath@:MyOwn.jar MyOwn "$@"

这里用@project.classpath@作为类路径的占位符,避免和Maven自身变量冲突。

  1. 配置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>
  1. 配置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>
  1. 自动添加执行权限(可选)
    用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插件的模板功能:

  1. 创建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>
  1. 配置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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:47:03