jstart
jstart 是用 D 语言实现的轻量级 Java 工件(jar/war)启动器,取代旧的 Boot Toolkit 启动脚本。 它本身是独立的原生可执行文件,定位是命令而非常驻服务。
功能和原理
jstart 面向瘦 jar/war:读取包内的依赖清单(jar 为 META-INF/beangle/dependencies, war 为 WEB-INF/classes/META-INF/beangle/dependencies),把缺失的依赖从 Maven 仓库 下载到本地并做 .sha1 校验,再以正确的 classpath exec 成 java 启动应用;war 则由 [engine] init 命令先准备容器环境,再 exec 容器。依赖清单是依赖的唯一来源——jstart 不做传递依赖解析,全部运行期依赖须由构建期插件显式写全。
- 正式版依赖默认走内置镜像(阿里云 → 华为云 → Maven Central),可
--remote=覆盖; SNAPSHOT 走独立的--snapshot-remote=,两者互不混合; - 本地仓库默认
~/.m2/repository,SNAPSHOT 时间戳构件单独放在~/.m2/snapshots; - 下载走宿主
curl,支持并行与增量补丁;stop按 base 停止run启动的实例。
一、Maven工程中生成依赖文件
如果使用Maven构建项目,可以只通过插件在打包的时候生成这个依赖文件,省去手工编辑。
<plugin>
<groupId>org.beangle.maven</groupId>
<artifactId>beangle-maven-plugin</artifactId>
<version>0.3.32</version>
<executions>
<execution>
<id>generate</id>
<phase>compile</phase>
<goals>
<goal>dependencies</goal>
</goals>
</execution>
</executions>
</plugin>如果是普通的Jar工程,则配置maven-jar-plugin,添加Main-Class,如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.yourcompany.project.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>在工程的pom.xml中的plugins中添加这两个插件,并配置工程的入口类com.yourcompany.project.MainClass,这样在打包时就可以生成依赖文件。 ⚠️如果是spring-boot项目需要禁用spring-boot-maven-plugin插件,这个插件默认会打出fat jar。
如果是War工程,需要配置maven-war-plugin,避免打包其他依赖到WEB-INF/lib中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<packagingExcludes>
%regex[WEB-INF/lib/.*[^T].jar]
</packagingExcludes>
</configuration>
</plugin>二、Sbt工程中生成依赖文件
在工程的project/plugins.sbt中引入Beangle构建插件:
addSbtPlugin("org.beangle.build" % "sbt-beangle-build" % "0.1.10")并在project/build.properties中把sbt升级到2.x:
sbt.version=2.0.9插件的BootPlugin是自动启用的,编译后会在META-INF/beangle/dependencies生成依赖文件,并随jar 自动打包,无需在build.sbt中做额外配置。如果这个jar需要直接启动,则再声明入口类:
Compile / packageBin / packageOptions +=
Package.ManifestAttributes(java.util.jar.Attributes.Name.MAIN_CLASS -> "org.your.main.class.name")之后执行sbt package,打包结果中就会带上依赖文件。也可以单独执行sbt bootDependencies 生成该文件(写入target/scala-*/resource_managed/main/META-INF/beangle/dependencies), 或执行sbt bootRepo在target/repository组装一份Maven布局的离线仓库。更多说明见Beangle Build。
三、安装
下载 jstart 的原生可执行文件并放到 PATH(运行需宿主 curl)。源码与下载见 beangle/jstart。
四、启动jar包
jstart run /path/to/your/project.jar
jstart run -Xmx1G -Dk1=v1 /path/to/your/project.jar arg1 arg2
jstart run org.beangle.sqlplus:beangle-sqlplus:0.0.46 db.xml-D/-X开头的参数归 JVM,其余原样传给应用;- 需要额外 classpath 时设置环境变量
CLASSPATH_EXTRA; - 主类按
--main=<class>> launch spec 的[app] main> jar 内Main-Class确定; jstart run --print <target>只打印将执行的命令、不启动。
五、解析与查看
jstart resolve app.jar # 准备依赖并输出应用绝对路径(exit=0 表示依赖齐备)
jstart classpath app.jar # 输出 Main-Class@classpath,便于自定义启动脚本
jstart info app.jar # 输出结构化解析结果(key: value)六、运行war包 / 多实例
裸 war 必须写进 launch spec 的 [app] entry,并由 [engine] init 命令启动容器。日常由 basctl 编排:
basctl run /path/to/app.war --port=8080 --path=/app # 嵌入式单应用
basctl start <farm|server|all> # 按 conf/server.xml 管理多实例basctl 生成 launch spec 并调用 jstart,jstart 完成依赖解析与进程拉起。
七、停止
jstart stop <target> # 停止 run 启动的实例(按 base)