make example-graalvm-native work

This commit is contained in:
shaojin.wensj 2023-02-13 08:47:33 +08:00
parent 7dfba0979c
commit 271b2cc710
4 changed files with 385 additions and 92 deletions

View File

@ -0,0 +1,6 @@
# build & run
```shell
mvn clean package -Pnative -DskipTests
./target/my-app
```

View File

@ -34,8 +34,8 @@
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>${maven.compiler.source}</maven.compiler.target>
<native.maven.plugin.version>0.9.19</native.maven.plugin.version>
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
<fastjson2.version>2.0.24-SNAPSHOT</fastjson2.version>
<imageName>fastjson2-example-graalvm-native</imageName>
</properties>
@ -92,15 +92,9 @@
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${project.version}</version>
<version>${fastjson2.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>junit-platform-native</artifactId>
<version>${native.maven.plugin.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
@ -112,36 +106,64 @@
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${native.maven.plugin.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
<execution>
<id>test-native</id>
<goals>
<goal>test</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<skip>false</skip>
<useArgFile>false</useArgFile>
<imageName>${imageName}</imageName>
<fallback>false</fallback>
<classpath>
<param>${project.build.directory}/${project.artifactId}-${project.version}-shaded.jar</param>
</classpath>
<archive>
<manifest>
<mainClass>com.alibaba.fastjson2.example.graalvm_native.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.19</version>
<extensions>true</extensions>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
</execution>
<execution>
<id>test-native</id>
<goals>
<goal>test</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
<configuration>
<imageName>my-app</imageName>
<buildArgs>
<buildArg>-H:+ReportExceptionStackTraces</buildArg>
<!-- <buildArg>-H:+StaticExecutableWithDynamicLibC</buildArg> -->
<buildArg>--verbose</buildArg>
<!-- For Quick Build (22.1+) -->
<buildArg>-Ob</buildArg>
</buildArgs>
<!-- Start: Workaround for 22.2: Disable the default Java Module Path using USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM -->
<!-- <environment>
<USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM>false</USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM>
</environment> -->
<!-- End: Workaround for 22.2: Disable the default Java Module Path using USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -0,0 +1,321 @@
package com.alibaba.fastjson2.example.graalvm_native;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.reader.ObjectReaders;
import com.alibaba.fastjson2.writer.ObjectWriters;
import java.util.ArrayList;
import java.util.List;
import static com.alibaba.fastjson2.reader.ObjectReaders.*;
import static com.alibaba.fastjson2.reader.ObjectReaders.fieldReaderString;
public class App {
public static void main(String[] args) throws Exception {
String str = "{\"images\": [{\n" +
" \"height\":768,\n" +
" \"size\":\"LARGE\",\n" +
" \"title\":\"Javaone Keynote\",\n" +
" \"uri\":\"http://javaone.com/keynote_large.jpg\",\n" +
" \"width\":1024\n" +
" }, {\n" +
" \"height\":240,\n" +
" \"size\":\"SMALL\",\n" +
" \"title\":\"Javaone Keynote\",\n" +
" \"uri\":\"http://javaone.com/keynote_small.jpg\",\n" +
" \"width\":320\n" +
" }\n" +
" ],\n" +
" \"media\": {\n" +
" \"bitrate\":262144,\n" +
" \"duration\":18000000,\n" +
" \"format\":\"video/mpg4\",\n" +
" \"height\":480,\n" +
" \"persons\": [\n" +
" \"Bill Gates\",\n" +
" \"Steve Jobs\"\n" +
" ],\n" +
" \"player\":\"JAVA\",\n" +
" \"size\":58982400,\n" +
" \"title\":\"Javaone Keynote\",\n" +
" \"uri\":\"http://javaone.com/keynote.mpg\",\n" +
" \"width\":640\n" +
" }\n" +
"}";
registerReaderAndWriter();
MediaContent mediaContent = JSON.parseObject(str, MediaContent.class);
int LOOP_COUNT = 1000000;
for (int j = 0; j < 5; ++j) {
long start = System.currentTimeMillis();
for (int i = 0; i < LOOP_COUNT; i++) {
JSON.toJSONString(mediaContent);
}
long millis = System.currentTimeMillis() - start;
System.out.println("fastjson2 eishay toJSONString time : " + millis);
}
for (int j = 0; j < 5; ++j) {
long start = System.currentTimeMillis();
for (int i = 0; i < LOOP_COUNT; i++) {
JSON.parseObject(str, MediaContent.class);
}
long millis = System.currentTimeMillis() - start;
System.out.println("fastjson2 eishay parseObject time : " + millis);
}
}
private static void registerReaderAndWriter() {
JSON.register(MediaContent.class, ObjectWriters.objectWriter(
MediaContent.class,
ObjectWriters.fieldWriter("media", Media.class, (MediaContent e) -> e.getMedia()),
ObjectWriters.fieldWriterList("images", Image.class, (MediaContent e) -> e.getImages())
));
JSON.register(MediaContent.class, ObjectReaders.of(
MediaContent::new,
fieldReader("media", Media.class, (MediaContent o, Media v) -> o.setMedia(v)),
fieldReaderList("images", Image.class, ArrayList::new, (MediaContent o, List<Image> v) -> o.setImages(v))
));
JSON.register(Media.class, ObjectWriters.objectWriter(
Media.class,
ObjectWriters.fieldWriter("bitrate", (Media e) -> e.getBitrate()),
ObjectWriters.fieldWriter("duration", (Media e) -> e.getDuration()),
ObjectWriters.fieldWriter("format", (Media e) -> e.getFormat()),
ObjectWriters.fieldWriter("height", (Media e) -> e.getHeight()),
ObjectWriters.fieldWriterList("persons", String.class, (Media e) -> e.getPersons()),
ObjectWriters.fieldWriter("player", Player.class, (Media e) -> e.getPlayer()),
ObjectWriters.fieldWriter("size", (Media e) -> e.getSize()),
ObjectWriters.fieldWriter("title", (Media e) -> e.getTitle()),
ObjectWriters.fieldWriter("uri", (Media e) -> e.getUri()),
ObjectWriters.fieldWriter("width", (Media e) -> e.getWidth()),
ObjectWriters.fieldWriter("copyright", (Media e) -> e.getCopyright())
));
JSON.register(Media.class, ObjectReaders.of(
Media::new,
fieldReaderInt("bitrate", Media::setBitrate),
fieldReaderLong("duration", Media::setDuration),
fieldReaderString("format", Media::setFormat),
fieldReaderInt("height", Media::setHeight),
fieldReaderList("persons", String.class, ArrayList::new, (Media o, List<String> v) -> o.setPersons(v)),
fieldReader("player", Player.class, (Media o, Player v) -> o.setPlayer(v)),
fieldReaderLong("size", Media::setSize),
fieldReaderString("title", Media::setTitle),
fieldReaderString("uri", Media::setUri),
fieldReaderInt("width", Media::setWidth),
fieldReaderString("copyright", Media::setCopyright)
));
JSON.register(Image.class, ObjectWriters.objectWriter(
Image.class,
ObjectWriters.fieldWriter("height", Image::getHeight),
ObjectWriters.fieldWriter("size", Size.class, (Image e) -> e.getSize()),
ObjectWriters.fieldWriter("title", Image::getTitle),
ObjectWriters.fieldWriter("uri", Image::getUri),
ObjectWriters.fieldWriter("width", Image::getWidth)
));
JSON.register(Image.class, ObjectReaders.of(
Image::new,
fieldReaderInt("height", Image::setHeight),
fieldReader("size", Size.class, (Image o, Size v) -> o.setSize(v)),
fieldReader("title", String.class, (Image o, String v) -> o.setTitle(v)),
fieldReader("uri", String.class, (Image o, String v) -> o.setUri(v)),
fieldReaderInt("width", Image::setWidth)
));
}
public static class MediaContent
implements java.io.Serializable {
public Media media;
public List<Image> images;
public MediaContent() {
}
public void setMedia(Media media) {
this.media = media;
}
public void setImages(List<Image> images) {
this.images = images;
}
public Media getMedia() {
return media;
}
public List<Image> getImages() {
return images;
}
}
public enum Size {
SMALL, LARGE
}
public static class Image
implements java.io.Serializable {
private int height;
private Size size;
private String title;
private String uri;
private int width;
public Image() {
}
public void setUri(String uri) {
this.uri = uri;
}
public void setTitle(String title) {
this.title = title;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setSize(Size size) {
this.size = size;
}
public String getUri() {
return uri;
}
public String getTitle() {
return title;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public Size getSize() {
return size;
}
}
public enum Player {
JAVA, FLASH
}
public static class Media
implements java.io.Serializable {
private int bitrate; // Can be unset.
private long duration;
private String format;
private int height;
private List<String> persons;
private Player player;
private long size;
private String title;
private String uri;
private int width;
private String copyright;
public Media() {
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public int getBitrate() {
return bitrate;
}
public void setBitrate(int bitrate) {
this.bitrate = bitrate;
}
public List<String> getPersons() {
return persons;
}
public void setPersons(List<String> persons) {
this.persons = persons;
}
public Player getPlayer() {
return player;
}
public void setPlayer(Player player) {
this.player = player;
}
public String getCopyright() {
return copyright;
}
public void setCopyright(String copyright) {
this.copyright = copyright;
}
}
}

View File

@ -1,56 +0,0 @@
package com.alibaba.fastjson2.example.graalvm_native;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
public class Hello {
@Test
public void test() throws Exception {
String jmvName = System.getProperty("java.vm.name");
System.out.println("java.vm.name : " + jmvName);
User user = new User(1, "雷卷");
List list = new ArrayList();
list.add(user);
String jsonText = JSON.toJSONString(list);
List<User> user2 = JSON.parseArray(jsonText, User.class);
System.out.println(jsonText);
System.out.println("Fastjson: " + user2.get(0).getNick());
System.out.println(JSONReader.of("{}").getClass().getName());
System.out.println(JSONReader.of("{}").getObjectReader(User.class).getClass());
}
public static class User {
private Integer id;
private String nick;
public User() {
}
public User(Integer id, String nick) {
this.id = id;
this.nick = nick;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
}
}