packwise-skills 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursorrules +23 -23
- package/CLAUDE.md +25 -25
- package/LICENSE +21 -0
- package/README.md +404 -295
- package/audit.md +224 -224
- package/bin/packwise.js +322 -155
- package/install.sh +123 -0
- package/package.json +32 -31
- package/skill.md +944 -719
- package/sub-skills/ai/local-llm.md +183 -183
- package/sub-skills/ai/python-ml.md +164 -164
- package/sub-skills/backend/go-server.md +184 -184
- package/sub-skills/backend/java-spring.md +241 -241
- package/sub-skills/backend/node-server.md +164 -164
- package/sub-skills/backend/php-laravel.md +175 -175
- package/sub-skills/backend/python-server.md +164 -164
- package/sub-skills/backend/rust-backend.md +118 -118
- package/sub-skills/cli/python-cli.md +236 -236
- package/sub-skills/cli/sdk-library.md +497 -497
- package/sub-skills/cloud/ci-cd-pipelines.md +350 -350
- package/sub-skills/cloud/docker.md +191 -191
- package/sub-skills/cloud/kubernetes.md +277 -277
- package/sub-skills/cloud/payment-integration.md +307 -307
- package/sub-skills/cross-platform/multiplatform.md +252 -252
- package/sub-skills/desktop/electron.md +783 -783
- package/sub-skills/desktop/game-dev.md +443 -443
- package/sub-skills/desktop/native-app.md +123 -123
- package/sub-skills/desktop/scenarios.md +443 -443
- package/sub-skills/desktop/smart-platforms.md +324 -324
- package/sub-skills/desktop/tauri.md +428 -428
- package/sub-skills/desktop/vr-ar.md +252 -252
- package/sub-skills/desktop/web-to-desktop.md +153 -153
- package/sub-skills/embedded/car-infotainment.md +129 -129
- package/sub-skills/embedded/esp32.md +184 -184
- package/sub-skills/embedded/ros.md +150 -150
- package/sub-skills/embedded/stm32.md +160 -160
- package/sub-skills/mobile/android.md +322 -322
- package/sub-skills/mobile/capacitor.md +232 -232
- package/sub-skills/mobile/flutter-mobile.md +138 -138
- package/sub-skills/mobile/harmonyos.md +150 -150
- package/sub-skills/mobile/ios.md +245 -245
- package/sub-skills/mobile/react-native.md +443 -443
- package/sub-skills/mobile/wearables.md +230 -230
- package/sub-skills/plugins/browser-extension.md +308 -308
- package/sub-skills/plugins/jetbrains-plugin.md +226 -226
- package/sub-skills/plugins/vscode-extension.md +204 -204
- package/sub-skills/security/security-tools.md +174 -174
- package/sub-skills/web/monorepo.md +274 -274
- package/sub-skills/web/pwa.md +220 -220
- package/sub-skills/web/serverless-edge.md +295 -295
- package/sub-skills/web/spa.md +266 -266
- package/sub-skills/web/ssr.md +228 -228
- package/sub-skills/web/wasm.md +243 -243
|
@@ -1,241 +1,241 @@
|
|
|
1
|
-
# Java/Spring Boot Build Sub-Skill
|
|
2
|
-
|
|
3
|
-
Build and package Java backend services using Spring Boot, Quarkus, or Micronaut.
|
|
4
|
-
|
|
5
|
-
**Current version**: Java 21 LTS / 22 / Spring Boot 3.5.x / Quarkus 3.37.x / Micronaut 5.x (2025-2026)
|
|
6
|
-
|
|
7
|
-
## When to Use
|
|
8
|
-
|
|
9
|
-
- Enterprise backend services
|
|
10
|
-
- REST APIs / GraphQL APIs
|
|
11
|
-
- Microservices architecture
|
|
12
|
-
- Team has Java/Kotlin experience
|
|
13
|
-
- Need mature ecosystem (Spring ecosystem)
|
|
14
|
-
|
|
15
|
-
## Spring Boot Build
|
|
16
|
-
|
|
17
|
-
### Maven Build
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
# Clean + package
|
|
21
|
-
mvn clean package -DskipTests
|
|
22
|
-
# Output: target/myapp-1.0.0.jar
|
|
23
|
-
|
|
24
|
-
# Run
|
|
25
|
-
java -jar target/myapp-1.0.0.jar
|
|
26
|
-
|
|
27
|
-
# Build with specific profile
|
|
28
|
-
mvn clean package -Pproduction
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Gradle Build
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
./gradlew clean build -x test
|
|
35
|
-
# Output: build/libs/myapp-1.0.0.jar
|
|
36
|
-
|
|
37
|
-
# Run
|
|
38
|
-
java -jar build/libs/myapp-1.0.0.jar
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Fat JAR vs Thin JAR
|
|
42
|
-
|
|
43
|
-
| Type | Size | Startup | Best For |
|
|
44
|
-
|------|------|---------|----------|
|
|
45
|
-
| Fat JAR (default) | 50–200MB | Standard | Simple deployment, Docker |
|
|
46
|
-
| Thin JAR | < 10MB | Faster (dependencies cached) | Multiple services sharing deps |
|
|
47
|
-
| Native Image (GraalVM) | 30–80MB | Ultra fast (< 1s) | Serverless, CLI, microservices |
|
|
48
|
-
|
|
49
|
-
### GraalVM Native Image
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
# Install GraalVM
|
|
53
|
-
sdk install java 21.0.2-graal
|
|
54
|
-
|
|
55
|
-
# Maven plugin (in pom.xml):
|
|
56
|
-
# <plugin>
|
|
57
|
-
# <groupId>org.graalvm.buildtools</groupId>
|
|
58
|
-
# <artifactId>native-maven-plugin</artifactId>
|
|
59
|
-
# </plugin>
|
|
60
|
-
|
|
61
|
-
mvn -Pnative native:compile
|
|
62
|
-
# Output: target/myapp (native binary, no JVM required)
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Docker
|
|
66
|
-
|
|
67
|
-
```dockerfile
|
|
68
|
-
FROM eclipse-temurin:21-jdk-jammy AS builder
|
|
69
|
-
WORKDIR /app
|
|
70
|
-
COPY pom.xml .
|
|
71
|
-
COPY src/ src/
|
|
72
|
-
RUN apt-get update && apt-get install -y maven && mvn clean package -DskipTests
|
|
73
|
-
|
|
74
|
-
FROM eclipse-temurin:21-jre-jammy
|
|
75
|
-
WORKDIR /app
|
|
76
|
-
COPY --from=builder /app/target/*.jar app.jar
|
|
77
|
-
RUN groupadd -r appuser && useradd -r -g appuser appuser && \
|
|
78
|
-
chown -R appuser:appuser /app
|
|
79
|
-
USER appuser
|
|
80
|
-
EXPOSE 8080
|
|
81
|
-
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/actuator/health || exit 1
|
|
82
|
-
ENTRYPOINT ["java", "-jar", "app.jar"]
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
```dockerfile
|
|
86
|
-
# GraalVM native image Docker (smaller, faster)
|
|
87
|
-
FROM ghcr.io/graalvm/native-image-community:21 AS builder
|
|
88
|
-
WORKDIR /app
|
|
89
|
-
COPY target/myapp .
|
|
90
|
-
RUN native-image --static -o myapp-native myapp
|
|
91
|
-
|
|
92
|
-
FROM debian:bookworm-slim
|
|
93
|
-
COPY --from=builder /app/myapp-native /myapp
|
|
94
|
-
RUN groupadd -r appuser && useradd -r -g appuser appuser
|
|
95
|
-
USER appuser
|
|
96
|
-
EXPOSE 8080
|
|
97
|
-
CMD ["/myapp"]
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## jpackage (Native Installers for Java Desktop/CLI Apps)
|
|
101
|
-
|
|
102
|
-
`jpackage` is a JDK 14+ tool that creates native platform installers from JAR files — no JVM required on the target machine.
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
# Prerequisites: JDK 17+ with jpackage (included in JDK 14+)
|
|
106
|
-
|
|
107
|
-
# 1. Build fat JAR first
|
|
108
|
-
mvn clean package -DskipTests
|
|
109
|
-
|
|
110
|
-
# 2. Create native installer
|
|
111
|
-
# Windows (.exe / .msi)
|
|
112
|
-
jpackage --type exe \
|
|
113
|
-
--input target/ \
|
|
114
|
-
--main-jar myapp-1.0.0.jar \
|
|
115
|
-
--main-class com.example.Main \
|
|
116
|
-
--name MyApp \
|
|
117
|
-
--app-version 1.0.0 \
|
|
118
|
-
--icon src/main/resources/icon.ico \
|
|
119
|
-
--win-shortcut \
|
|
120
|
-
--win-menu
|
|
121
|
-
|
|
122
|
-
# macOS (.pkg / .dmg)
|
|
123
|
-
jpackage --type dmg \
|
|
124
|
-
--input target/ \
|
|
125
|
-
--main-jar myapp-1.0.0.jar \
|
|
126
|
-
--main-class com.example.Main \
|
|
127
|
-
--name MyApp \
|
|
128
|
-
--app-version 1.0.0 \
|
|
129
|
-
--icon src/main/resources/icon.icns \
|
|
130
|
-
--mac-package-identifier com.example.myapp
|
|
131
|
-
|
|
132
|
-
# Linux (.deb / .rpm)
|
|
133
|
-
jpackage --type deb \
|
|
134
|
-
--input target/ \
|
|
135
|
-
--main-jar myapp-1.0.0.jar \
|
|
136
|
-
--main-class com.example.Main \
|
|
137
|
-
--name MyApp \
|
|
138
|
-
--app-version 1.0.0 \
|
|
139
|
-
--icon src/main/resources/icon.png \
|
|
140
|
-
--linux-shortcut
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### jpackage vs Docker vs GraalVM Native Image
|
|
144
|
-
|
|
145
|
-
| Approach | Output | JVM Required? | Size | Startup | Best For |
|
|
146
|
-
|----------|--------|--------------|------|---------|----------|
|
|
147
|
-
| jpackage | .exe/.msi/.dmg/.deb/.rpm | No (bundled JRE) | 40-100MB | 1-3s | Desktop/CLI distribution to non-technical users |
|
|
148
|
-
| Docker | Container image | Yes (in container) | 100-300MB | 2-5s | Server deployment |
|
|
149
|
-
| GraalVM Native | Native binary | No | 30-80MB | < 1s | Serverless, CLI, microservices |
|
|
150
|
-
| Fat JAR | .jar file | Yes (user must install JDK) | 50-200MB | 2-8s | Developer tools, server deployment |
|
|
151
|
-
|
|
152
|
-
### jpackage with Spring Boot (Special Handling)
|
|
153
|
-
|
|
154
|
-
Spring Boot fat JARs have a nested JAR structure that `jpackage` doesn't handle well. Use the Spring Boot thin launcher or repack:
|
|
155
|
-
|
|
156
|
-
```xml
|
|
157
|
-
<!-- pom.xml — Use Spring Boot thin launcher -->
|
|
158
|
-
<plugin>
|
|
159
|
-
<groupId>org.springframework.boot</groupId>
|
|
160
|
-
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
161
|
-
<configuration>
|
|
162
|
-
<layout>ZIP</layout> <!-- Thin layout for jpackage compatibility -->
|
|
163
|
-
</configuration>
|
|
164
|
-
</plugin>
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
# Build thin JAR + dependencies
|
|
169
|
-
mvn clean package -DskipTests
|
|
170
|
-
|
|
171
|
-
# jpackage with classpath
|
|
172
|
-
jpackage --type exe \
|
|
173
|
-
--input target/ \
|
|
174
|
-
--main-jar myapp-1.0.0.jar \
|
|
175
|
-
--main-class org.springframework.boot.loader.launch.JarLauncher \
|
|
176
|
-
--name MyApp \
|
|
177
|
-
--app-version 1.0.0
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Common Pitfalls (jpackage)
|
|
181
|
-
|
|
182
|
-
| Issue | Fix |
|
|
183
|
-
|-------|-----|
|
|
184
|
-
| "jpackage not found" | Ensure JDK 17+ is installed (not JRE); `jpackage` is in `JAVA_HOME/bin` |
|
|
185
|
-
| Spring Boot JAR fails to launch | Use `layout: ZIP` in spring-boot-maven-plugin; or repack with `maven-shade-plugin` |
|
|
186
|
-
| Missing native libraries | Add `--java-options "-Djava.library.path=/app/libs"` |
|
|
187
|
-
| macOS notarization fails | Sign the .pkg with `codesign` before notarizing; jpackage doesn't auto-sign |
|
|
188
|
-
| Windows SmartScreen warning | Sign the .exe with EV/OV certificate after jpackage creates it |
|
|
189
|
-
| Large installer size | Use `--jlink-options "--strip-debug --compress zip-6"` to reduce bundled JRE size |
|
|
190
|
-
| Icon not showing | Ensure icon format is correct (.ico for Windows, .icns for macOS, .png for Linux) |
|
|
191
|
-
|
|
192
|
-
## Quarkus Build
|
|
193
|
-
|
|
194
|
-
```bash
|
|
195
|
-
# Create project (replace 3.37 with latest Quarkus version)
|
|
196
|
-
mvn io.quarkus.platform:quarkus-maven-plugin:3.37:create -DprojectGroupId=com.example -DprojectArtifactId=myapp
|
|
197
|
-
|
|
198
|
-
# JVM mode
|
|
199
|
-
mvn clean package
|
|
200
|
-
java -jar target/quarkus-run.jar
|
|
201
|
-
|
|
202
|
-
# Native mode (requires GraalVM)
|
|
203
|
-
mvn clean package -Pnative
|
|
204
|
-
./target/myapp
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## Micronaut Build
|
|
208
|
-
|
|
209
|
-
```bash
|
|
210
|
-
# Create project
|
|
211
|
-
mn create-app com.example.myapp
|
|
212
|
-
|
|
213
|
-
# Build
|
|
214
|
-
./gradlew clean build
|
|
215
|
-
|
|
216
|
-
# Native image
|
|
217
|
-
./gradlew nativeCompile
|
|
218
|
-
# Output: build/native/nativeCompile/myapp
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
## Framework Comparison
|
|
222
|
-
|
|
223
|
-
| Feature | Spring Boot | Quarkus | Micronaut |
|
|
224
|
-
|---------|------------|---------|----------|
|
|
225
|
-
| Maturity | Most mature | Growing fast | Growing |
|
|
226
|
-
| Startup time | 2–8s (JVM), < 1s (native) | < 1s (native) | < 1s (native) |
|
|
227
|
-
| Memory | 200–500MB (JVM) | 30–80MB (native) | 30–80MB (native) |
|
|
228
|
-
| Native image | Supported (GraalVM) | First-class | First-class |
|
|
229
|
-
| Ecosystem | Largest (Spring) | Good (Vert.x-based) | Good (Netty-based) |
|
|
230
|
-
| Best for | Enterprise, large teams | Cloud-native, serverless | Microservices, serverless |
|
|
231
|
-
|
|
232
|
-
## Common Pitfalls
|
|
233
|
-
|
|
234
|
-
| Issue | Fix |
|
|
235
|
-
|-------|-----|
|
|
236
|
-
| JAR too large (> 200MB) | Exclude unused dependencies; use Spring Boot thin launcher |
|
|
237
|
-
| GraalVM reflection errors | Add `reflect-config.json`; use `@RegisterForReflection` (Quarkus) |
|
|
238
|
-
| Slow startup in containers | Use CDS (Class Data Sharing); consider native image |
|
|
239
|
-
| Port conflict | Set `server.port` in `application.properties` or `SERVER_PORT` env |
|
|
240
|
-
| Database connection pool exhausted | Configure HikariCP pool size; add connection timeout |
|
|
241
|
-
| Actuator endpoints not exposed | Add `management.endpoints.web.exposure.include=health,info` |
|
|
1
|
+
# Java/Spring Boot Build Sub-Skill
|
|
2
|
+
|
|
3
|
+
Build and package Java backend services using Spring Boot, Quarkus, or Micronaut.
|
|
4
|
+
|
|
5
|
+
**Current version**: Java 21 LTS / 22 / Spring Boot 3.5.x / Quarkus 3.37.x / Micronaut 5.x (2025-2026)
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
- Enterprise backend services
|
|
10
|
+
- REST APIs / GraphQL APIs
|
|
11
|
+
- Microservices architecture
|
|
12
|
+
- Team has Java/Kotlin experience
|
|
13
|
+
- Need mature ecosystem (Spring ecosystem)
|
|
14
|
+
|
|
15
|
+
## Spring Boot Build
|
|
16
|
+
|
|
17
|
+
### Maven Build
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Clean + package
|
|
21
|
+
mvn clean package -DskipTests
|
|
22
|
+
# Output: target/myapp-1.0.0.jar
|
|
23
|
+
|
|
24
|
+
# Run
|
|
25
|
+
java -jar target/myapp-1.0.0.jar
|
|
26
|
+
|
|
27
|
+
# Build with specific profile
|
|
28
|
+
mvn clean package -Pproduction
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Gradle Build
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
./gradlew clean build -x test
|
|
35
|
+
# Output: build/libs/myapp-1.0.0.jar
|
|
36
|
+
|
|
37
|
+
# Run
|
|
38
|
+
java -jar build/libs/myapp-1.0.0.jar
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Fat JAR vs Thin JAR
|
|
42
|
+
|
|
43
|
+
| Type | Size | Startup | Best For |
|
|
44
|
+
|------|------|---------|----------|
|
|
45
|
+
| Fat JAR (default) | 50–200MB | Standard | Simple deployment, Docker |
|
|
46
|
+
| Thin JAR | < 10MB | Faster (dependencies cached) | Multiple services sharing deps |
|
|
47
|
+
| Native Image (GraalVM) | 30–80MB | Ultra fast (< 1s) | Serverless, CLI, microservices |
|
|
48
|
+
|
|
49
|
+
### GraalVM Native Image
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Install GraalVM
|
|
53
|
+
sdk install java 21.0.2-graal
|
|
54
|
+
|
|
55
|
+
# Maven plugin (in pom.xml):
|
|
56
|
+
# <plugin>
|
|
57
|
+
# <groupId>org.graalvm.buildtools</groupId>
|
|
58
|
+
# <artifactId>native-maven-plugin</artifactId>
|
|
59
|
+
# </plugin>
|
|
60
|
+
|
|
61
|
+
mvn -Pnative native:compile
|
|
62
|
+
# Output: target/myapp (native binary, no JVM required)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Docker
|
|
66
|
+
|
|
67
|
+
```dockerfile
|
|
68
|
+
FROM eclipse-temurin:21-jdk-jammy AS builder
|
|
69
|
+
WORKDIR /app
|
|
70
|
+
COPY pom.xml .
|
|
71
|
+
COPY src/ src/
|
|
72
|
+
RUN apt-get update && apt-get install -y maven && mvn clean package -DskipTests
|
|
73
|
+
|
|
74
|
+
FROM eclipse-temurin:21-jre-jammy
|
|
75
|
+
WORKDIR /app
|
|
76
|
+
COPY --from=builder /app/target/*.jar app.jar
|
|
77
|
+
RUN groupadd -r appuser && useradd -r -g appuser appuser && \
|
|
78
|
+
chown -R appuser:appuser /app
|
|
79
|
+
USER appuser
|
|
80
|
+
EXPOSE 8080
|
|
81
|
+
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/actuator/health || exit 1
|
|
82
|
+
ENTRYPOINT ["java", "-jar", "app.jar"]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```dockerfile
|
|
86
|
+
# GraalVM native image Docker (smaller, faster)
|
|
87
|
+
FROM ghcr.io/graalvm/native-image-community:21 AS builder
|
|
88
|
+
WORKDIR /app
|
|
89
|
+
COPY target/myapp .
|
|
90
|
+
RUN native-image --static -o myapp-native myapp
|
|
91
|
+
|
|
92
|
+
FROM debian:bookworm-slim
|
|
93
|
+
COPY --from=builder /app/myapp-native /myapp
|
|
94
|
+
RUN groupadd -r appuser && useradd -r -g appuser appuser
|
|
95
|
+
USER appuser
|
|
96
|
+
EXPOSE 8080
|
|
97
|
+
CMD ["/myapp"]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## jpackage (Native Installers for Java Desktop/CLI Apps)
|
|
101
|
+
|
|
102
|
+
`jpackage` is a JDK 14+ tool that creates native platform installers from JAR files — no JVM required on the target machine.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Prerequisites: JDK 17+ with jpackage (included in JDK 14+)
|
|
106
|
+
|
|
107
|
+
# 1. Build fat JAR first
|
|
108
|
+
mvn clean package -DskipTests
|
|
109
|
+
|
|
110
|
+
# 2. Create native installer
|
|
111
|
+
# Windows (.exe / .msi)
|
|
112
|
+
jpackage --type exe \
|
|
113
|
+
--input target/ \
|
|
114
|
+
--main-jar myapp-1.0.0.jar \
|
|
115
|
+
--main-class com.example.Main \
|
|
116
|
+
--name MyApp \
|
|
117
|
+
--app-version 1.0.0 \
|
|
118
|
+
--icon src/main/resources/icon.ico \
|
|
119
|
+
--win-shortcut \
|
|
120
|
+
--win-menu
|
|
121
|
+
|
|
122
|
+
# macOS (.pkg / .dmg)
|
|
123
|
+
jpackage --type dmg \
|
|
124
|
+
--input target/ \
|
|
125
|
+
--main-jar myapp-1.0.0.jar \
|
|
126
|
+
--main-class com.example.Main \
|
|
127
|
+
--name MyApp \
|
|
128
|
+
--app-version 1.0.0 \
|
|
129
|
+
--icon src/main/resources/icon.icns \
|
|
130
|
+
--mac-package-identifier com.example.myapp
|
|
131
|
+
|
|
132
|
+
# Linux (.deb / .rpm)
|
|
133
|
+
jpackage --type deb \
|
|
134
|
+
--input target/ \
|
|
135
|
+
--main-jar myapp-1.0.0.jar \
|
|
136
|
+
--main-class com.example.Main \
|
|
137
|
+
--name MyApp \
|
|
138
|
+
--app-version 1.0.0 \
|
|
139
|
+
--icon src/main/resources/icon.png \
|
|
140
|
+
--linux-shortcut
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### jpackage vs Docker vs GraalVM Native Image
|
|
144
|
+
|
|
145
|
+
| Approach | Output | JVM Required? | Size | Startup | Best For |
|
|
146
|
+
|----------|--------|--------------|------|---------|----------|
|
|
147
|
+
| jpackage | .exe/.msi/.dmg/.deb/.rpm | No (bundled JRE) | 40-100MB | 1-3s | Desktop/CLI distribution to non-technical users |
|
|
148
|
+
| Docker | Container image | Yes (in container) | 100-300MB | 2-5s | Server deployment |
|
|
149
|
+
| GraalVM Native | Native binary | No | 30-80MB | < 1s | Serverless, CLI, microservices |
|
|
150
|
+
| Fat JAR | .jar file | Yes (user must install JDK) | 50-200MB | 2-8s | Developer tools, server deployment |
|
|
151
|
+
|
|
152
|
+
### jpackage with Spring Boot (Special Handling)
|
|
153
|
+
|
|
154
|
+
Spring Boot fat JARs have a nested JAR structure that `jpackage` doesn't handle well. Use the Spring Boot thin launcher or repack:
|
|
155
|
+
|
|
156
|
+
```xml
|
|
157
|
+
<!-- pom.xml — Use Spring Boot thin launcher -->
|
|
158
|
+
<plugin>
|
|
159
|
+
<groupId>org.springframework.boot</groupId>
|
|
160
|
+
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
161
|
+
<configuration>
|
|
162
|
+
<layout>ZIP</layout> <!-- Thin layout for jpackage compatibility -->
|
|
163
|
+
</configuration>
|
|
164
|
+
</plugin>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Build thin JAR + dependencies
|
|
169
|
+
mvn clean package -DskipTests
|
|
170
|
+
|
|
171
|
+
# jpackage with classpath
|
|
172
|
+
jpackage --type exe \
|
|
173
|
+
--input target/ \
|
|
174
|
+
--main-jar myapp-1.0.0.jar \
|
|
175
|
+
--main-class org.springframework.boot.loader.launch.JarLauncher \
|
|
176
|
+
--name MyApp \
|
|
177
|
+
--app-version 1.0.0
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Common Pitfalls (jpackage)
|
|
181
|
+
|
|
182
|
+
| Issue | Fix |
|
|
183
|
+
|-------|-----|
|
|
184
|
+
| "jpackage not found" | Ensure JDK 17+ is installed (not JRE); `jpackage` is in `JAVA_HOME/bin` |
|
|
185
|
+
| Spring Boot JAR fails to launch | Use `layout: ZIP` in spring-boot-maven-plugin; or repack with `maven-shade-plugin` |
|
|
186
|
+
| Missing native libraries | Add `--java-options "-Djava.library.path=/app/libs"` |
|
|
187
|
+
| macOS notarization fails | Sign the .pkg with `codesign` before notarizing; jpackage doesn't auto-sign |
|
|
188
|
+
| Windows SmartScreen warning | Sign the .exe with EV/OV certificate after jpackage creates it |
|
|
189
|
+
| Large installer size | Use `--jlink-options "--strip-debug --compress zip-6"` to reduce bundled JRE size |
|
|
190
|
+
| Icon not showing | Ensure icon format is correct (.ico for Windows, .icns for macOS, .png for Linux) |
|
|
191
|
+
|
|
192
|
+
## Quarkus Build
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Create project (replace 3.37 with latest Quarkus version)
|
|
196
|
+
mvn io.quarkus.platform:quarkus-maven-plugin:3.37:create -DprojectGroupId=com.example -DprojectArtifactId=myapp
|
|
197
|
+
|
|
198
|
+
# JVM mode
|
|
199
|
+
mvn clean package
|
|
200
|
+
java -jar target/quarkus-run.jar
|
|
201
|
+
|
|
202
|
+
# Native mode (requires GraalVM)
|
|
203
|
+
mvn clean package -Pnative
|
|
204
|
+
./target/myapp
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Micronaut Build
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# Create project
|
|
211
|
+
mn create-app com.example.myapp
|
|
212
|
+
|
|
213
|
+
# Build
|
|
214
|
+
./gradlew clean build
|
|
215
|
+
|
|
216
|
+
# Native image
|
|
217
|
+
./gradlew nativeCompile
|
|
218
|
+
# Output: build/native/nativeCompile/myapp
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Framework Comparison
|
|
222
|
+
|
|
223
|
+
| Feature | Spring Boot | Quarkus | Micronaut |
|
|
224
|
+
|---------|------------|---------|----------|
|
|
225
|
+
| Maturity | Most mature | Growing fast | Growing |
|
|
226
|
+
| Startup time | 2–8s (JVM), < 1s (native) | < 1s (native) | < 1s (native) |
|
|
227
|
+
| Memory | 200–500MB (JVM) | 30–80MB (native) | 30–80MB (native) |
|
|
228
|
+
| Native image | Supported (GraalVM) | First-class | First-class |
|
|
229
|
+
| Ecosystem | Largest (Spring) | Good (Vert.x-based) | Good (Netty-based) |
|
|
230
|
+
| Best for | Enterprise, large teams | Cloud-native, serverless | Microservices, serverless |
|
|
231
|
+
|
|
232
|
+
## Common Pitfalls
|
|
233
|
+
|
|
234
|
+
| Issue | Fix |
|
|
235
|
+
|-------|-----|
|
|
236
|
+
| JAR too large (> 200MB) | Exclude unused dependencies; use Spring Boot thin launcher |
|
|
237
|
+
| GraalVM reflection errors | Add `reflect-config.json`; use `@RegisterForReflection` (Quarkus) |
|
|
238
|
+
| Slow startup in containers | Use CDS (Class Data Sharing); consider native image |
|
|
239
|
+
| Port conflict | Set `server.port` in `application.properties` or `SERVER_PORT` env |
|
|
240
|
+
| Database connection pool exhausted | Configure HikariCP pool size; add connection timeout |
|
|
241
|
+
| Actuator endpoints not exposed | Add `management.endpoints.web.exposure.include=health,info` |
|