Graalvm 安装和静态编译

news2024/11/16 16:00:01

文章目录

    • 1、下载
    • 2、graalvm安装
    • 3、native-image工具安装
      • 3.1 安装native-image
      • 3.2 安装C++编译工具
    • 4、java编译成二进制exe
      • 4.1、普通的java命令行应用
      • 4.2、Swing应用编译
      • 4.3、使用maven插件静态编译
      • 4.4、javafx应用编译

1、下载

文件下载:https://www.graalvm.org/downloads/
安装教程:https://www.graalvm.org/22.3/docs/getting-started/
下载下边两个文件

graalvm-ce-java17-windows-amd64-22.3.0.zip        # 包含openjdk的作用
native-image-installable-svm-java17-windows-amd64-22.3.0.jar # 把java编译成二进制工具

在这里插入图片描述

2、graalvm安装

graalvm-ce-java17-windows-amd64-22.3.0.zip解压即可用
在这里插入图片描述

3、native-image工具安装

3.1 安装native-image

native-image支持本地安装(native-image-installable-svm-java17-windows-amd64-22.3.0.jar)和在线安装。
本地安装

gu -L ../../install native-image-installable-svm-java17-windows-amd64-22.3.0.jar

在线安装命令

gu install native-image

安装完成后,C:\Program Files\Java\graalvm\graalvm-ce-java17-22.3.0\bin目录会有相关native-image的命令和文件
在这里插入图片描述

native-image查看版本

native-image --version

设置环境变量

GRAALVM_HOME=C:\Program Files\Java\graalvm\graalvm-ce-java17-22.3.0
# 把GRAALVM_HOME加到PATH变量后边
PATH=........;%GRAALVM_HOME%\bin

在这里插入图片描述

3.2 安装C++编译工具

native-image编译java为二进制,需要依赖C++编译工具,安装 vs2019, 选中 “使用 C++ 的桌面开发”,可选组件中选择 “VS 2019 C++ x64/x86” 生成工具和 “Windows 10 SDK”
在这里插入图片描述
配置VC环境变量1

MSVC=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133
PATH=.........;%MSVC%\bin\HostX64\x64

如果不配置,可能会出现下边错误

# 出错1
Error: Default native-compiler executable 'cl.exe' not found via environment variable PATH
Error: To prevent native-toolchain checking provide command-line option -H:-CheckToolchain
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception

配置VC环境变量2

WK10_INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0
WK10_LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0
INCLUDE=%WK10_INCLUDE%\ucrt;%WK10_INCLUDE%\um;%WK10_INCLUDE%\shared;%MSVC%\include;
LIB=%WK10_LIB%\um\x64;%WK10_LIB%\ucrt\x64;%MSVC%\lib\x64;
# 出错2
Error: Error compiling query code (in C:\Users\penngo\AppData\Local\Temp\SVM-1701580662269299485\AMD64LibCHelperDirectives.c). Compiler command ''C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64\cl.exe' /WX /W4 /wd4244 /wd4245 /wd4800 /wd4804 /wd4214 '/FeC:\Users\penngo\AppData\Local\Temp\SVM-1701580662269299485\AMD64LibCHelperDirectives.exe' 'C:\Users\penngo\AppData\Local\Temp\SVM-1701580662269299485\AMD64LibCHelperDirectives.c'' output included error: [AMD64LibCHelperDirectives.c, C:\Users\penngo\AppData\Local\Temp\SVM-1701580662269299485\AMD64LibCHelperDirectives.c(1): fatal error C1034: stdio.h: 不包括路径集]

如果不使用上边的环境变量配置,也可以在构建前使用vs2019的命令来设置环境变量,可以在命令行执行下边的命令来初始化变量

call "D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"

4、java编译成二进制exe

4.1、普通的java命令行应用

Main.java

package com.penngo.gralvm;

public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>graalvm_test</artifactId>
        <groupId>com.penngo.gralvm</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>console</artifactId>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
</project>

native_build.bat

SET class_path=target/console-1.0.jar;
native-image -classpath %class_path% com.penngo.gralvm.Main

编译结果
在这里插入图片描述
运行exe
在这里插入图片描述

4.2、Swing应用编译

MainSwing.java

package com.penngo.gralvm;
import javax.swing.*;

public class MainSwing {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("title");
        JButton button = new JButton("Test button");
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.add(button);//把button添加到JFrame中
        jFrame.setSize(300,300);//设置JFrame大小
        jFrame.setVisible(true);//设置可见,不然的话看不到
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>graalvm_test</artifactId>
        <groupId>com.penngo.gralvm</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>swing</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
    </dependencies>
</project>

直接用上边4.1的方式来编译二进制也是成功的,但是运行会报错

Exception in thread "main" java.lang.NoSuchMethodError: java.awt.Toolkit.getDefaultToolkit()Ljava/awt/Toolkit;
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions$Support.getMethodID(JNIFunctions.java:1259)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions$Support.getMethodID(JNIFunctions.java:1244)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions.GetStaticMethodID(JNIFunctions.java:413)
        at java.desktop@17.0.5/java.awt.Toolkit.initIDs(Toolkit.java)
        at java.desktop@17.0.5/java.awt.Toolkit.initStatic(Toolkit.java:1425)
        at java.desktop@17.0.5/java.awt.Toolkit.<clinit>(Toolkit.java:1397)
        at java.desktop@17.0.5/java.awt.Component.<clinit>(Component.java:624)
        at java.base@17.0.5/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at java.base@17.0.5/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at java.base@17.0.5/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at java.base@17.0.5/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at com.penngo.gralvm.MainSwing.main(MainSwing.java:14)

主要是因为Swing运行时一些jni对象和反射类没有被加载造成的。graalvm提供native-image-agent工具来收集这些运行库信息,并保存到 reflect-config.json、jni-config.json、resource-config.json、proxy-config.json、serialization-config.json 和 predefined-classes-config.json 这 6 个 json 格式的配置文件这几个配置文件。当然,如果你熟悉需要用到的库或类,也可以手动编写这几个文件。

native_agnet_build.bat

set GRAALVM_HOME=C:\Progra~1\Java\graalvm\graalvm-ce-java17-22.3.0
SET class_path=target/swing-1.0.jar;
%GRAALVM_HOME%/bin/java -classpath %class_path% -agentlib:native-image-agent=config-output-dir=META-INF/native-image com.penngo.gralvm.MainSwing

运行native_agnet_build.bat,需要把所有功能执行一次,这样才能收集完整的运行库信息。

native_build.bat

SET class_path=target/swing-1.0.jar;
native-image --no-fallback -classpath %class_path% com.penngo.gralvm.MainSwing

在这里插入图片描述
新建 conf\fonts 目录,复制 graalvm-ce-java17-22.3.0\lib\fontconfig.bfc 文件到 swing\conf\fonts目录
在这里插入图片描述

执行完native_build.bat后,输入下边命令运行swing应用

com.penngo.gralvm.mainswing.exe -Djava.home=.

注意需要加参数“-Djava.home=.”,不然会报下边类似的错误

Exception in thread "AWT-EventQueue-0" java.lang.InternalError: java.lang.reflect.InvocationTargetException
        at java.desktop@17.0.5/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:87)
        at java.base@17.0.5/java.security.AccessController.executePrivileged(AccessController.java:168)
        at java.base@17.0.5/java.security.AccessController.doPrivileged(AccessController.java:318)
        at java.desktop@17.0.5/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:75)
        ......
Caused by: java.lang.reflect.InvocationTargetException
        at java.base@17.0.5/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base@17.0.5/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at java.desktop@17.0.5/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:85)
        ... 55 more
Caused by: java.lang.Error: java.home property not set
        at java.desktop@17.0.5/sun.awt.FontConfiguration.findFontConfigFile(FontConfiguration.java:181)
        at java.desktop@17.0.5/sun.awt.FontConfiguration.<init>(FontConfiguration.java:98)
        at java.desktop@17.0.5/sun.awt.windows.WFontConfiguration.<init>(WFontConfiguration.java:41)
        .......

4.3、使用maven插件静态编译

使用4.2的swing源码,
native_agnet_build.bat收集的运行库信息META-INF/native-image需要放进resource目录中,代码目录结构如下:
在这里插入图片描述
MainSwing.java

package com.penngo.gralvm;
import javax.swing.*;
public class MainSwing {
    static {
        // 设置java.home,运行时不再需要指定目录
        System.setProperty("java.home", ".");
    }
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("title");
        JButton button = new JButton("Test button");
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.add(button);
        jFrame.setSize(300,300);
        jFrame.setVisible(true);
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>graalvm_test</artifactId>
        <groupId>com.penngo.gralvm</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>swing_plugin</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <graalvm.version>22.3.0</graalvm.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.graalvm.sdk</groupId>
            <artifactId>graal-sdk</artifactId>
            <version>${graalvm.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <configuration>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.graalvm.nativeimage</groupId>
                <artifactId>native-image-maven-plugin</artifactId>
                <version>21.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>native-image</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
                <configuration>
                    <skip>false</skip>
                    <imageName>MainSwing</imageName>
                    <mainClass>com.penngo.gralvm.MainSwing</mainClass>
                    <!-- -no-fallback -H:-DeleteLocalSymbols -->
                    <buildArgs>

                    </buildArgs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.source}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

命令行输入mvn package编译
在这里插入图片描述
编译后target目录
在这里插入图片描述
可以在命令输入MainSwing.exe,或双击运行,但是上边编译的exe还是会带黑窗体。

4.4、javafx应用编译

Desktop.java

package com.penngo.gralvm;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.Text;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

import java.io.File;

public class Desktop extends Application {
    private TextField createField;
    
    public void start(Stage stage){
        stage.setTitle("JavaFX测试");
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        ColumnConstraints cc0 = new ColumnConstraints();
        cc0.setMinWidth(GridPane.USE_PREF_SIZE);
        System.out.println(grid.getColumnConstraints().size());
        grid.getColumnConstraints().add(cc0);//.add(cc);

        ColumnConstraints cc1 = new ColumnConstraints();
        cc1.setMinWidth(GridPane.USE_PREF_SIZE);
        cc1.setHgrow(Priority.ALWAYS);
        grid.getColumnConstraints().add(cc1);//.add(cc);

        Text scenetitle = new Text("");
        grid.add(scenetitle, 0, 0, 2, 1);
        Label userName = new Label("文件名:");
        grid.add(userName, 0, 1);

        TextField selectField = new TextField();
        grid.add(selectField, 1, 1);

        Button buttonLoad = new Button("选择文件");
        buttonLoad.setOnAction(arg0 -> {
            FileChooser fileChooser = new FileChooser();
            fileChooser.setInitialDirectory(new File("."));
            FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.pdf)", "*.pdf");
            fileChooser.getExtensionFilters().add(extFilter);
            File file = fileChooser.showOpenDialog(stage);
            if(file != null){
                selectField.setText(file.getAbsolutePath());
            }

        });
        grid.add(buttonLoad, 2, 1);

        Label pw = new Label("生成文件:");
        grid.add(pw, 0, 2);

        createField = new TextField();
        grid.add(createField, 1, 2);

        ProgressIndicator pi = new ProgressIndicator();
        pi.setVisible(false);
        grid.add(pi, 0, 4);

        Button btn = new Button("解析文件");
        HBox hbBtn = new HBox(10);
        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        grid.add(hbBtn, 1, 4);

        Scene scene = new Scene(grid, 500, 275);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

module-info.java

module com.penngo.gralvm.app {
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.base;
    requires javafx.graphics;
    requires javafx.media;
    requires javafx.swing;
    requires javafx.web;
    exports com.penngo.gralvm;
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>graalvm_test</artifactId>
        <groupId>com.penngo.gralvm</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>javafx</artifactId>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <openjfx.version>17.0.2</openjfx.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>${openjfx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${openjfx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>${openjfx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-swing</artifactId>
            <version>${openjfx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>${openjfx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${openjfx.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.gluonhq</groupId>
                <artifactId>gluonfx-maven-plugin</artifactId>
                <version>1.0.16</version>
                <configuration>
                    <mainClass>com.penngo.gralvm.Desktop</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.source}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

gluonhq插件https://docs.gluonhq.com/#_goals,可用命令:

gluonfx:run
gluonfx:runagent
gluonfx:compile
gluonfx:link
gluonfx:build
gluonfx:package
gluonfx:install
gluonfx:nativerun

gluonhq插件可用参数https://docs.gluonhq.com/#_configuration

<plugin>
    <groupId>com.gluonhq</groupId>
    <artifactId>gluonfx-maven-plugin</artifactId>
    <version>1.0.16</version>
    <configuration>
        <target>host</target>
        <mainClass>your.mainClass</mainClass>
        <bundlesList></bundlesList>
        <resourcesList></resourcesList>
        <reflectionList></reflectionList>
        <jniList></jniList>
        <attachList></attachList>
        <nativeImageArgs></nativeImageArgs>
        <linkerArgs></linkerArgs>
        <runtimeArgs></runtimeArgs>
        <verbose>false</verbose>
        <graalvmHome></graalvmHome>
        <javaStaticSdkVersion>11-ea+10</javaStaticSdkVersion>
        <javafxStaticSdkVersion>20-ea+7</javafxStaticSdkVersion>
        <enableSWRendering>false</enableSWRendering>
        <remoteHostName></remoteHostName>
        <remoteDir></remoteDir>
        <appIdentifier></appIdentifier>
        <releaseConfiguration>
            <!-- all targets -->
            <packageType></packageType>
            <description></description>
            <vendor></vendor>
            <!-- macOS -->
            <macAppStore></macAppStore>
            <macSigningUserName></macSigningUserName>
            <macAppCategory></macAppCategory>
            <!-- macOS/iOS -->
            <bundleName></bundleName>
            <bundleVersion>1.0</bundleVersion>
            <bundleShortVersion>1.0</bundleShortVersion>
            <providedSigningIdentity></providedSigningIdentity>
            <providedProvisioningProfile></providedProvisioningProfile>
            <skipSigning>false</skipSigning>
            <!-- iOS Simulator -->
            <simulatorDevice></simulatorDevice>
            <!-- Android -->
            <appLabel></appLabel>
            <versionCode>1</versionCode>
            <versionName>1.0</versionName>
            <providedKeyStorePath>${android-keystore-path}</providedKeyStorePath>
            <providedKeyStorePassword>${android-keystore-password}</providedKeyStorePassword>
            <providedKeyAlias>${android-key-alias}</providedKeyAlias>
            <providedKeyAliasPassword>${android-key-password}</providedKeyAliasPassword>
        </releaseConfiguration>
    </configuration>
</plugin>

编译

mvn clean gluonfx:build

在这里插入图片描述
target\gluonfx\x86_64-windows目录下会生成相应的exe可执行文件
在这里插入图片描述

运行,可以直接双击exe运行,可以使用插件命令运行

mvn gluonfx:nativerun

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计JAVA剧本杀门店管理系统-

[附源码]计算机毕业设计JAVA剧本杀门店管理系统- 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myb…

OBS-VirtualCam OBS的虚拟摄像头插件

OBS-VirtualCam 是OBS的一个虚拟摄像头插件&#xff0c;可以将OBS中的内容提供给一个虚拟摄像头&#xff0c;这样其它软件就可以使用这个内容了&#xff0c;这里试试这个插件功能。 1. 下载obs并安装 登录OBS Studio网站&#xff0c;下载windows版&#xff0c; 下载完成后并安装…

栈的基本操作

目录 一、什么是栈&#xff1f; 二、用单链表实现栈 三、用顺序表数组实现栈 一、什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是一个先进后出&#xff08;FILO-First In Last Out&#xff09;的有序列表。 主要方法&#xff1a;入栈&#xff08;push&#xff09;…

SCA算法优化脉冲耦合神经网络的图像自动分割(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

【C语言】初识指针(终篇)

摸了一手秀发&#xff0c;发现还在~ 目录 1、指针运算 1.1指针加减整数 1.2指针减指针 1.3指针关系运算 2、二级指针 3、指针和数组 4、指针数组 前言&#xff1a; 大家好&#xff0c;我是拳击哥。上一期我们讲到了指针类型&#xff0c;指针的访问步长&#xff0c;野指针…

Redis数据类型总结

文章目录一、5种数据类型二、常用指令汇总三、应用汇总提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 一、5种数据类型 Redis 数据存储格式&#xff1a;  ● redis 自身是一个 Map ,其中所有的数据都是采用 key : value 的形式存储。  ● 数…

如何设计用户体验测试用例

一、 什么是用户体验 UE&#xff1a; User Experience 用户体验。 用户体验是指用户在使用产品过程中的个人主观感受&#xff0c;即用户在使用一个产品之前、使用过程中、使用后的整体感受&#xff0c;包括行为、情感、喜好、生理和心里反应、成就等各个方面。 通俗的讲用户体…

希望所有计算机学生都知道这些宝藏网站

GitHub GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持Git作为唯一的版本库格式进行托管&#xff0c;故名GitHub。 作为开源代码库以及版本控制系统&#xff0c;Github拥有超过900万开发者用户。随着越来越多的应用程序转移到了云上&#xff0c;Github已…

数据结构与算法(五) 动态规划

这篇文章来讲动态规划&#xff08;Dynamic Programming&#xff09;&#xff0c;这是一个在面试中很经常出现的题型 1、本质 之前说过&#xff0c;解决算法问题的主流思路就是穷举搜索&#xff0c;即遍历整个搜索空间&#xff0c;找到给定问题的解 只是在某些场景下&#xff…

Python学习 - 异常处理

Python学习 - 语法入门&#xff1a;https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型&#xff1a;https://blog.csdn.net/wanzijy/article/details/125341568 Python学习 - 流程控制&#xff1a;https://blog.csdn.net/wanzijy/article/details…

3dmax网渲云渲染哪个平台费用低?一张图要多少钱多长时间?怎么收费

话说现在的设计师应该没有不知道云渲染的吧&#xff1f;毕竟比起本地渲&#xff0c;云渲染不占本地资源&#xff0c;一次能渲很多张&#xff0c;方便又快捷&#xff0c;有谁不喜欢呢&#xff01;那么这么多的云渲染平台用哪个呢&#xff1f;今天我们就以主流的4个平台为例&…

(STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(4)使用LVGL

上一篇&#xff1a; (STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(3)使用DMA 经过前几章的搭建&#xff0c;底层显示已经没有问题了&#xff0c;现在需要添加上层的库&#xff0c;我选择了比较火的开源GUI库--LVGL。而RT-Thread Studio支持直接添加LVGL代码库的。 在RT-T…

人工智能-4计算机视觉和图像处理01

深度学习简介 机器学习是实现人工智能的一种途径&#xff0c;深度学习是机器学习的一个子集 深度学习相比于机器学习&#xff0c;少了‘手动特征提取’部分&#xff0c;交给网络来处理 深度学习流程&#xff1a;数据输入–训练模型&#xff08;在数据中学习&#xff09;–输出预…

IP请求工具

无缝的 IP 分配和管理 手动将不同子网中的 IP 分配给不同的 IT 管理员&#xff0c;同时遵守配置的不同访问级别可能是一项繁琐的任务。为了简化IP请求和分配的过程&#xff0c;OpUtils为您提供了一个内置的IP请求工具。使用此工具&#xff0c;您的网络管理员不必再等待其 IP 请…

数据库笔记

文章目录01 数据库概述1.1 四个基本概念1.2 数据管理技术的三个阶段1.2.1 人工管理阶段1.2.2 文件系统阶段1.2.3 数据库阶段1.3 数据独立性1.4 数据库的三级模式结构1.4.1 三级模式结构1.4.2 数据库的二级映像与数据独立性02 关系数据库2.1 关系数据结构及形式化定义2.1.1 关系…

论文管理系统(增删查改功能的实现)

目录 一、后端 1.1实体类 1.2paperMapper类 1.3 PaperMapper类 1.4Service层 1.5 Controller层 二、前端 源代码 我们已经实现列表数据了,接下来我们将实现增删查改功能,新增和修改还能够回显 一、后端 1.1实体类 实体类还是我们上一版的列表功能的实现的paper实…

IFD-x 微型红外成像仪探测距离说明

红外热成像仪是用光学镜头来收集被测物体的热辐射能量的&#xff0c;故此探测距离会受镜头视场角 和热成像像素分辨率有关。 假如某成像仪的成像分辨率为 32*32 像素&#xff0c;视场角为 75 度&#xff0c;则可以理解为从镜头发射出 32*321024 条激光来探测 1024 个点的…

数据结构初阶:队列

目录 一、队列的概念和结构 二、队列的实现 定义队列结构 初始化队列 销毁队列 检测队列是否为空 入队列 出队列 获取队列头部元素 获取队列队尾元素 获取队列中有效元素个数 优化 三、测试 四、优化后的全部代码 一、队列的概念和结构 队列:只允许在一端进行插入数据操作…

【区块链】用Python实现一条区块链

用Python实现一条区块链 点击链接获取可执行文件 本文使用 python 实现了一条简单的区块链。主要分两个模块&#xff1a;实现每个区块的结构和相关的方法、实现整条区块链的结构和相关的方法。下面是对这两个模块的描述。 每个区块主要包括两个成员&#xff1a;区块头和区块…

GlobalWebsoket.js 的使用,实现获取实时数据

在称重小程序是使用 GlobalWebsoket 实现获取实时数据前言一、逻辑分析二、实现方式1.方法整体流转分析 -- 初始化并绑定1. onLoad1. init2. getDeviceInfo3. initWebSocket4. setProperties2.方法整体流转分析 -- 解除绑定1. onBackPress2. remoeSubscribe三、参数调用分析四、…