Skip to content

Commit 69459d5

Browse files
committed
native-image, remove member caching
1 parent f9add79 commit 69459d5

File tree

14 files changed

+456
-4762
lines changed

14 files changed

+456
-4762
lines changed

.github/workflows/build.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ jobs:
2828
steps:
2929
- uses: actions/checkout@v4
3030
- name: Set up JDK 17
31-
uses: actions/setup-java@v4
31+
uses: graalvm/setup-graalvm@v1
3232
with:
3333
java-version: '17'
34-
distribution: 'temurin'
34+
distribution: 'graalvm-community'
3535
- name: Build JAR
36-
run: ./gradlew shadowJar
36+
run: ./gradlew nativeCompile
3737
- name: Build Docker image
3838
run: docker build -t javabot .
3939
- name: Tag docker image

Dockerfile

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
FROM eclipse-temurin:21-jre
2-
RUN mkdir /work
3-
COPY build/libs/JavaBot-1.0.0-SNAPSHOT-all.jar /work/bot.jar
1+
FROM alpine
2+
RUN apk add --no-cache libsm libxrender libxext libxtst libxi gcompat ttf-dejavu
3+
4+
COPY build/native/nativeCompile /work
45
WORKDIR /work
6+
57
RUN chown 1000:1000 /work
8+
USER 1000
9+
ENV HOME=/work
10+
11+
# https://github.com/openjdk/jdk/pull/20169
12+
# need to create fake JAVA_HOME
13+
RUN mkdir -p /tmp/JAVA_HOME/conf/fonts
14+
RUN mkdir /tmp/JAVA_HOME/lib
15+
16+
617
VOLUME "/work/config"
718
VOLUME "/work/logs"
819
VOLUME "/work/db"
920
VOLUME "/work/purgeArchives"
10-
USER 1000
11-
ENTRYPOINT [ "java", "-jar", "bot.jar" ]
21+
ENTRYPOINT [ "./javabot", "-Djava.home=/tmp/JAVA_HOME" ]

build.gradle.kts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import com.github.jengelman.gradle.plugins.shadow.transformers.*
44
plugins {
55
java
66
id("com.github.johnrengelman.shadow") version "7.1.2"
7-
id("org.springframework.boot") version "3.2.0"
8-
id("io.spring.dependency-management") version "1.0.15.RELEASE"
7+
id("org.springframework.boot") version "3.3.5"
8+
id("io.spring.dependency-management") version "1.1.6"
9+
id("org.graalvm.buildtools.native") version "0.10.3"
910
checkstyle
1011
}
1112

@@ -64,6 +65,9 @@ dependencies {
6465
// Spring
6566
implementation("org.springframework.boot:spring-boot-starter-web")
6667
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
68+
69+
//required for registering native hints
70+
implementation("org.jetbrains.kotlin:kotlin-reflect")
6771
}
6872

6973
configurations {
@@ -101,4 +105,15 @@ tasks.withType<ShadowJar> {
101105
checkstyle {
102106
toolVersion = "9.1"
103107
configDirectory.set(File("checkstyle"))
104-
}
108+
}
109+
110+
graalvmNative {
111+
binaries {
112+
named("main") {
113+
//For development:
114+
//quickBuild.set(true)
115+
buildArgs.add("-H:+UnlockExperimentalVMOptions")
116+
buildArgs.add("-H:JNIConfigurationFiles=${projectDir}/graal/jni-config.json")
117+
}
118+
}
119+
}

graal/jni-config.json

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
[
2+
{
3+
"name":"[Lsun.font.FontConfigManager$FontConfigFont;"
4+
},
5+
{
6+
"name":"[Lsun.java2d.loops.GraphicsPrimitive;"
7+
},
8+
{
9+
"name":"java.awt.AlphaComposite",
10+
"fields":[{"name":"extraAlpha"}, {"name":"rule"}]
11+
},
12+
{
13+
"name":"java.awt.Color",
14+
"methods":[{"name":"getRGB","parameterTypes":[] }]
15+
},
16+
{
17+
"name":"java.awt.GraphicsEnvironment",
18+
"methods":[{"name":"isHeadless","parameterTypes":[] }]
19+
},
20+
{
21+
"name":"java.awt.geom.AffineTransform",
22+
"fields":[{"name":"m00"}, {"name":"m01"}, {"name":"m02"}, {"name":"m10"}, {"name":"m11"}, {"name":"m12"}]
23+
},
24+
{
25+
"name":"java.awt.geom.GeneralPath",
26+
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"<init>","parameterTypes":["int","byte[]","int","float[]","int"] }]
27+
},
28+
{
29+
"name":"java.awt.geom.Path2D",
30+
"fields":[{"name":"numTypes"}, {"name":"pointTypes"}, {"name":"windingRule"}]
31+
},
32+
{
33+
"name":"java.awt.geom.Path2D$Float",
34+
"fields":[{"name":"floatCoords"}]
35+
},
36+
{
37+
"name":"java.awt.geom.Point2D$Float",
38+
"fields":[{"name":"x"}, {"name":"y"}],
39+
"methods":[{"name":"<init>","parameterTypes":["float","float"] }]
40+
},
41+
{
42+
"name":"java.awt.geom.Rectangle2D$Float",
43+
"fields":[{"name":"height"}, {"name":"width"}, {"name":"x"}, {"name":"y"}],
44+
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"<init>","parameterTypes":["float","float","float","float"] }]
45+
},
46+
{
47+
"name":"java.awt.image.BufferedImage",
48+
"fields":[{"name":"colorModel"}, {"name":"imageType"}, {"name":"raster"}],
49+
"methods":[{"name":"getRGB","parameterTypes":["int","int","int","int","int[]","int","int"] }, {"name":"setRGB","parameterTypes":["int","int","int","int","int[]","int","int"] }]
50+
},
51+
{
52+
"name":"java.awt.image.ColorModel",
53+
"fields":[{"name":"colorSpace"}, {"name":"colorSpaceType"}, {"name":"isAlphaPremultiplied"}, {"name":"is_sRGB"}, {"name":"nBits"}, {"name":"numComponents"}, {"name":"supportsAlpha"}, {"name":"transparency"}],
54+
"methods":[{"name":"getRGBdefault","parameterTypes":[] }]
55+
},
56+
{
57+
"name":"java.awt.image.IndexColorModel",
58+
"fields":[{"name":"allgrayopaque"}, {"name":"colorData"}, {"name":"map_size"}, {"name":"rgb"}, {"name":"transparent_index"}]
59+
},
60+
{
61+
"name":"java.awt.image.Raster",
62+
"fields":[{"name":"dataBuffer"}, {"name":"height"}, {"name":"minX"}, {"name":"minY"}, {"name":"numBands"}, {"name":"numDataElements"}, {"name":"sampleModel"}, {"name":"sampleModelTranslateX"}, {"name":"sampleModelTranslateY"}, {"name":"width"}]
63+
},
64+
{
65+
"name":"java.awt.image.SampleModel",
66+
"fields":[{"name":"height"}, {"name":"width"}],
67+
"methods":[{"name":"getPixels","parameterTypes":["int","int","int","int","int[]","java.awt.image.DataBuffer"] }, {"name":"setPixels","parameterTypes":["int","int","int","int","int[]","java.awt.image.DataBuffer"] }]
68+
},
69+
{
70+
"name":"java.awt.image.SinglePixelPackedSampleModel",
71+
"fields":[{"name":"bitMasks"}, {"name":"bitOffsets"}, {"name":"bitSizes"}, {"name":"maxBitSize"}]
72+
},
73+
{
74+
"name":"java.lang.Boolean",
75+
"methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
76+
},
77+
{
78+
"name":"java.lang.System",
79+
"methods":[{"name":"load","parameterTypes":["java.lang.String"] }]
80+
},
81+
{
82+
"name":"sun.awt.SunHints",
83+
"fields":[{"name":"INTVAL_STROKE_PURE"}]
84+
},
85+
{
86+
"name":"sun.awt.image.BufImgSurfaceData$ICMColorData",
87+
"fields":[{"name":"pData"}],
88+
"methods":[{"name":"<init>","parameterTypes":["long"] }]
89+
},
90+
{
91+
"name":"sun.awt.image.ByteComponentRaster",
92+
"fields":[{"name":"data"}, {"name":"dataOffsets"}, {"name":"pixelStride"}, {"name":"scanlineStride"}, {"name":"type"}]
93+
},
94+
{
95+
"name":"sun.awt.image.IntegerComponentRaster",
96+
"fields":[{"name":"data"}, {"name":"dataOffsets"}, {"name":"pixelStride"}, {"name":"scanlineStride"}, {"name":"type"}]
97+
},
98+
{
99+
"name":"sun.font.CharToGlyphMapper",
100+
"methods":[{"name":"charToGlyph","parameterTypes":["int"] }]
101+
},
102+
{
103+
"name":"sun.font.Font2D",
104+
"methods":[{"name":"canDisplay","parameterTypes":["char"] }, {"name":"charToGlyph","parameterTypes":["int"] }, {"name":"charToVariationGlyph","parameterTypes":["int","int"] }, {"name":"getMapper","parameterTypes":[] }, {"name":"getTableBytes","parameterTypes":["int"] }]
105+
},
106+
{
107+
"name":"sun.font.FontConfigManager$FcCompFont",
108+
"fields":[{"name":"allFonts"}, {"name":"fcName"}, {"name":"firstFont"}]
109+
},
110+
{
111+
"name":"sun.font.FontConfigManager$FontConfigFont",
112+
"fields":[{"name":"familyName"}, {"name":"fontFile"}, {"name":"fullName"}, {"name":"styleStr"}],
113+
"methods":[{"name":"<init>","parameterTypes":[] }]
114+
},
115+
{
116+
"name":"sun.font.FontConfigManager$FontConfigInfo",
117+
"fields":[{"name":"cacheDirs"}, {"name":"fcVersion"}]
118+
},
119+
{
120+
"name":"sun.font.FontStrike",
121+
"methods":[{"name":"getGlyphMetrics","parameterTypes":["int"] }]
122+
},
123+
{
124+
"name":"sun.font.FontUtilities",
125+
"methods":[{"name":"debugFonts","parameterTypes":[] }]
126+
},
127+
{
128+
"name":"sun.font.FreetypeFontScaler",
129+
"methods":[{"name":"invalidateScaler","parameterTypes":[] }]
130+
},
131+
{
132+
"name":"sun.font.GlyphList",
133+
"fields":[{"name":"gposx"}, {"name":"gposy"}, {"name":"images"}, {"name":"lcdRGBOrder"}, {"name":"lcdSubPixPos"}, {"name":"len"}, {"name":"positions"}, {"name":"usePositions"}]
134+
},
135+
{
136+
"name":"sun.font.PhysicalStrike",
137+
"fields":[{"name":"pScalerContext"}],
138+
"methods":[{"name":"adjustPoint","parameterTypes":["java.awt.geom.Point2D$Float"] }, {"name":"getGlyphPoint","parameterTypes":["int","int"] }]
139+
},
140+
{
141+
"name":"sun.font.StrikeMetrics",
142+
"methods":[{"name":"<init>","parameterTypes":["float","float","float","float","float","float","float","float","float","float"] }]
143+
},
144+
{
145+
"name":"sun.font.TrueTypeFont",
146+
"methods":[{"name":"readBlock","parameterTypes":["java.nio.ByteBuffer","int","int"] }, {"name":"readBytes","parameterTypes":["int","int"] }]
147+
},
148+
{
149+
"name":"sun.font.Type1Font",
150+
"methods":[{"name":"readFile","parameterTypes":["java.nio.ByteBuffer"] }]
151+
},
152+
{
153+
"name":"sun.java2d.Disposer",
154+
"methods":[{"name":"addRecord","parameterTypes":["java.lang.Object","long","long"] }]
155+
},
156+
{
157+
"name":"sun.java2d.InvalidPipeException"
158+
},
159+
{
160+
"name":"sun.java2d.NullSurfaceData"
161+
},
162+
{
163+
"name":"sun.java2d.SunGraphics2D",
164+
"fields":[{"name":"clipRegion"}, {"name":"composite"}, {"name":"eargb"}, {"name":"lcdTextContrast"}, {"name":"pixel"}, {"name":"strokeHint"}]
165+
},
166+
{
167+
"name":"sun.java2d.SurfaceData",
168+
"fields":[{"name":"pData"}, {"name":"valid"}]
169+
},
170+
{
171+
"name":"sun.java2d.loops.Blit",
172+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
173+
},
174+
{
175+
"name":"sun.java2d.loops.BlitBg",
176+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
177+
},
178+
{
179+
"name":"sun.java2d.loops.CompositeType",
180+
"fields":[{"name":"AnyAlpha"}, {"name":"Src"}, {"name":"SrcNoEa"}, {"name":"SrcOver"}, {"name":"SrcOverNoEa"}, {"name":"Xor"}]
181+
},
182+
{
183+
"name":"sun.java2d.loops.DrawGlyphList",
184+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
185+
},
186+
{
187+
"name":"sun.java2d.loops.DrawGlyphListAA",
188+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
189+
},
190+
{
191+
"name":"sun.java2d.loops.DrawGlyphListLCD",
192+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
193+
},
194+
{
195+
"name":"sun.java2d.loops.DrawLine",
196+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
197+
},
198+
{
199+
"name":"sun.java2d.loops.DrawParallelogram",
200+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
201+
},
202+
{
203+
"name":"sun.java2d.loops.DrawPath",
204+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
205+
},
206+
{
207+
"name":"sun.java2d.loops.DrawPolygons",
208+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
209+
},
210+
{
211+
"name":"sun.java2d.loops.DrawRect",
212+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
213+
},
214+
{
215+
"name":"sun.java2d.loops.FillParallelogram",
216+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
217+
},
218+
{
219+
"name":"sun.java2d.loops.FillPath",
220+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
221+
},
222+
{
223+
"name":"sun.java2d.loops.FillRect",
224+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
225+
},
226+
{
227+
"name":"sun.java2d.loops.FillSpans",
228+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
229+
},
230+
{
231+
"name":"sun.java2d.loops.GraphicsPrimitive",
232+
"fields":[{"name":"pNativePrim"}]
233+
},
234+
{
235+
"name":"sun.java2d.loops.GraphicsPrimitiveMgr",
236+
"methods":[{"name":"register","parameterTypes":["sun.java2d.loops.GraphicsPrimitive[]"] }]
237+
},
238+
{
239+
"name":"sun.java2d.loops.MaskBlit",
240+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
241+
},
242+
{
243+
"name":"sun.java2d.loops.MaskFill",
244+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
245+
},
246+
{
247+
"name":"sun.java2d.loops.ScaledBlit",
248+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
249+
},
250+
{
251+
"name":"sun.java2d.loops.SurfaceType",
252+
"fields":[{"name":"Any3Byte"}, {"name":"Any4Byte"}, {"name":"AnyByte"}, {"name":"AnyColor"}, {"name":"AnyInt"}, {"name":"AnyShort"}, {"name":"ByteBinary1Bit"}, {"name":"ByteBinary2Bit"}, {"name":"ByteBinary4Bit"}, {"name":"ByteGray"}, {"name":"ByteIndexed"}, {"name":"ByteIndexedBm"}, {"name":"FourByteAbgr"}, {"name":"FourByteAbgrPre"}, {"name":"Index12Gray"}, {"name":"Index8Gray"}, {"name":"IntArgb"}, {"name":"IntArgbBm"}, {"name":"IntArgbPre"}, {"name":"IntBgr"}, {"name":"IntRgb"}, {"name":"IntRgbx"}, {"name":"OpaqueColor"}, {"name":"ThreeByteBgr"}, {"name":"Ushort4444Argb"}, {"name":"Ushort555Rgb"}, {"name":"Ushort555Rgbx"}, {"name":"Ushort565Rgb"}, {"name":"UshortGray"}, {"name":"UshortIndexed"}]
253+
},
254+
{
255+
"name":"sun.java2d.loops.TransformHelper",
256+
"methods":[{"name":"<init>","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }]
257+
},
258+
{
259+
"name":"sun.java2d.loops.XORComposite",
260+
"fields":[{"name":"alphaMask"}, {"name":"xorColor"}, {"name":"xorPixel"}]
261+
},
262+
{
263+
"name":"sun.java2d.pipe.Region",
264+
"fields":[{"name":"bands"}, {"name":"endIndex"}, {"name":"hix"}, {"name":"hiy"}, {"name":"lox"}, {"name":"loy"}]
265+
},
266+
{
267+
"name":"sun.java2d.pipe.RegionIterator",
268+
"fields":[{"name":"curIndex"}, {"name":"numXbands"}, {"name":"region"}]
269+
}
270+
]

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
rootProject.name = "JavaBot"
1+
rootProject.name = "javabot"
22

0 commit comments

Comments
 (0)