主頁 > 後端開發 > ARM架構下的Docker環境,OpenJDK官方沒有8版本鏡像,如何完美解決?

ARM架構下的Docker環境,OpenJDK官方沒有8版本鏡像,如何完美解決?

2020-09-28 20:56:16 後端開發

為什么需要ARM架構下的OpenJDK8的Docker鏡像?

對現有的Java應用,之前一直運行在x86處理器環境下,編譯和運行都是JDK8,如今在樹莓派的Docker環境運行(或者其他ARM架構電腦,例如華為泰山服務器),需要JDK8鏡像作為基礎鏡像,

現在有什么問題?

在《ARM64架構下,OpenJDK的官方Docker鏡像為何沒有8版本?》一文中,已經確定了OpenJDK官方并未提供8版本的Docker鏡像,因此,原有的Java應用,如果是基于JDK8編譯和運行的,現在從X86架構轉戰到ARM架構的Docker環境下,就會面臨沒有JDK基礎鏡像的問題;

應對之道

《ARM64架構下,OpenJDK的官方Docker鏡像為何沒有8版本?》一文曾經提到應對之道:

  1. 自己編譯一個8版本的OpenJDK安裝包,以此來做Docker鏡像;
  2. Oracle提供了ARM版本的JDKD安裝包,以此包來做Docker鏡像;
  3. 用OpenJDK的11版本,但是11和8的差異要自行處理;

對于第一種方式,自己編譯8版本的OpenJDK,難度太大(對我自己而言),因為編譯OpenJDK需要低版本的OpenJDK作為編譯工具,也就是說我要找到ARM版本的OpenJDK7,才能編譯ARM版本的OpenJDK8,因此我覺得這樣做的難度太大…

今天要討論的是第二種和第三種,

環境資訊

  1. 硬體:樹莓派4B
  2. 作業系統:openfans的64為Debian
  3. Docker:19.03.1
  4. docker-compose:1.24.1

參考檔案

  1. 在樹莓派4B安裝64位Debian和Docker的方法,請參考《樹莓派4B安裝64位Linux(不用顯示幕鍵盤滑鼠)》
  2. 在樹莓派4B安裝docker-compose的方法,請參考《樹莓派4B安裝docker-compose(64位Linux)》
  3. 將Java應用制作成Docker鏡像,請參考《Docker與Jib(maven插件版)實戰》

Java應用的原始碼

本文要解決的問題是ARM架構的電腦上,如何在Docker環境運行Java應用,因此需要有個Java應用來驗證,這里找了個最普通的SpringBoot應用,提供一個hello world的http介面,通過jib插件構建成Docker鏡像,整個應用的原始碼可以從GitHub上下載,地址和鏈接資訊如下表所示:

名稱 鏈接 備注
專案主頁 https://github.com/zq2599/blog_demos 該專案在GitHub上的主頁
git倉庫地址(https) https://github.com/zq2599/blog_demos.git 該專案原始碼的倉庫地址,https協議
git倉庫地址(ssh) [email protected]:zq2599/blog_demos.git 該專案原始碼的倉庫地址,ssh協議

這個git專案中有多個檔案夾,本章的原始碼在hellojib檔案夾下,如下圖紅框所示:
在這里插入圖片描述

操作步驟簡介

接下來的操作步驟,如下圖所示:
在這里插入圖片描述

ARM機器上安裝JDK

要想在ARM機器上編譯構建hellojib工程,就要把JDK和Maven裝好,先裝JDK;

  1. 去Oracle網站下載ARM版本的JDK8,地址是:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,如下圖紅框所示:
    在這里插入圖片描述
  2. 上述JDK檔案解壓后是個名為jdk1.8.0_221的檔案夾,將此檔案夾放在ARM電腦的/usr/lib/jvm目錄下;
  3. 打開檔案~/.bashrc,增加以下內容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
  1. 執行source ~/.bashrc,使得配置立即生效;
  2. 執行命令java -version試試JDK是否已經可用:
root@raspbian:~# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

ARM機器上安裝Maven

  1. 去Maven官網下載安裝包,我這里下載的是3.6.2版本,地址:https://www-eu.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz
  2. 安裝包解壓之后是個名為apache-maven-3.6.2的檔案夾,將此檔案夾放在ARM電腦的/usr/local目錄下;
  3. 打開檔案~/.bashrc,增加以下內容:
export MAVEN_HOME=/usr/local/apache-maven-3.6.2
export PATH=$MAVEN_HOME/bin:$PATH
  1. 執行source ~/.bashrc,使得配置立即生效;
  2. 執行命令mvn -version試試maven是否已經可用:
root@raspbian:~# mvn -version
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-27T23:06:16+08:00)
Maven home: /usr/local/apache-maven-3.6.2
Java version: 1.8.0_221, vendor: Oracle Corporation, runtime: /usr/lib/jvm/jdk1.8.0_221/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.19.69-openfans+20190906-v8", arch: "aarch64", family: "unix"

折騰了這么久,總算是完成了準備作業,接下來開始做作鏡像了;

要把咱們自己的Java應用做成Docker鏡像,需要有個JDK8鏡像作為基礎鏡像,接下來我們來做這個基礎鏡像;

自己動手,做一個JDK8鏡像

  1. 在ARM電腦上新建一個檔案夾,里面新建名為Dockerfile的檔案,內容如下:
#Docker image of JDK8 in ARM64
# VERSION 8
# Author: bolingcavalry

#基礎鏡像使用的是OpenJDK官方鏡像公用的
FROM buildpack-deps:stretch-scm

#作者
MAINTAINER BolingCavalry <[email protected]>

# Default to UTF-8 file.encoding
ENV LANG C.UTF-8

ENV JAVA_HOME /usr/local/jdk8

ENV PATH $JAVA_HOME/bin:$PATH

ENV JDK_FILE jdk-8u221-linux-arm64-vfp-hflt.tar.gz

COPY $JDK_FILE /usr/local/

RUN mkdir -p "$JAVA_HOME"; \
    tar --extract \
		--file /usr/local/$JDK_FILE \
		--directory "$JAVA_HOME" \
		--strip-components 1 \
		--no-same-owner; \
    rm /usr/local/$JDK_FILE
  1. 將之前下載的jdk-8u221-linux-arm64-vfp-hflt.tar.gz檔案復制到Dockerfile檔案所在目錄;
  2. 在Dockerfile檔案所在目錄執行命令docker build -t bolingcavalry/arm64jdk:8 .(注意命令的末尾有個小數點,不要漏了)
  3. 執行成功后控制臺輸出以下資訊:
root@raspbian:~/test# docker build -t bolingcavalry/arm64jdk:8 .
Sending build context to Docker daemon   73.2MB
Step 1/8 : FROM buildpack-deps:stretch-scm
 ---> 1838b930d30a
Step 2/8 : MAINTAINER BolingCavalry <[email protected]>
 ---> Using cache
 ---> ce7488aef612
Step 3/8 : ENV LANG C.UTF-8
 ---> Using cache
 ---> 0bdb9ce285a9
Step 4/8 : ENV JAVA_HOME /usr/local/jdk8
 ---> Using cache
 ---> 39a412f0d874
Step 5/8 : ENV PATH $JAVA_HOME/bin:$PATH
 ---> Using cache
 ---> 1a3077d36d4e
Step 6/8 : ENV JDK_FILE jdk-8u221-linux-arm64-vfp-hflt.tar.gz
 ---> Using cache
 ---> c39af69e10f7
Step 7/8 : COPY $JDK_FILE /usr/local/
 ---> Using cache
 ---> 5fc704c5b9ff
Step 8/8 : RUN mkdir -p "$JAVA_HOME";     tar --extract 		--file /usr/local/$JDK_FILE 		--directory "$JAVA_HOME" 		--strip-components 1 		--no-same-owner;     rm /usr/local/$JDK_FILE
 ---> Running in a63663306adc
Removing intermediate container a63663306adc
 ---> ddc652d5dec0
Successfully built ddc652d5dec0
Successfully tagged bolingcavalry/arm64jdk:8
  1. 驗證一下效果:
root@raspbian:~/test# docker run --rm bolingcavalry/arm64jdk:8 java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

把鏡像推送到鏡像倉庫

將剛剛做好的鏡像推送到倉庫,這么做的原因如下:

  1. 可以讓大家使用到此鏡像;
  2. 接下來要用Jib插件將Java應用制作成鏡像,Jib插件一定要從鏡像倉庫下載bolingcavalry/arm64jdk:8作為Java應用的基礎鏡像;

這里我將bolingcavalry/arm64jdk:8推送到了hub.docker.com,如果您沒有hub.docker.com的賬號,也可以選擇推送到私有鏡像倉庫,只要是鏡像倉庫,Jib插件都支持;

將Java應用構建成鏡像

  1. 以前面提到的hellojib為例,打開pom.xml檔案,將jib插件的配置改為如下內容:
<!--使用jib插件-->
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>1.3.0</version>
                <configuration>
                    <!--from節點用來設定鏡像的基礎鏡像,相當于Docerkfile中的FROM關鍵字-->
                    <from>
                        <!--使用openjdk官方鏡像,tag是8-jdk-stretch,表示鏡像的作業系統是debian9,裝好了jdk8-->
			    <image>bolingcavalry/arm64jdk:8</image>
                    </from>
                    <to>
                        <!--鏡像名稱和tag,使用了mvn內置變數${project.version},表示當前工程的version-->
                        <image>bolingcavalry/hellojib:${project.version}</image>
                    </to>
                    <!--容器相關的屬性-->
                    <container>
                        <!--jvm記憶體引數-->
                        <jvmFlags>
                            <jvmFlag>-Xms1g</jvmFlag>
                            <jvmFlag>-Xmx1g</jvmFlag>
                        </jvmFlags>
                        <!--要暴露的埠-->
                        <ports>
                            <port>8080</port>
                        </ports>
                    </container>
                </configuration>
            </plugin>
  1. 執行命令mvn clean compile jib:dockerBui-U即可構建鏡像,控制臺輸出如下資訊(友情提示,這可能是個漫長的等待程序,我這等了9分多鐘):
root@raspbian:~/test/hellojib# mvn clean compile jib:dockerBuild -U
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< com.bolingcavalry:hellojib >---------------------
[INFO] Building hellojib 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ hellojib ---
[INFO] Deleting /root/test/hellojib/target
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ hellojib ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ hellojib ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /root/test/hellojib/target/classes
[INFO] 
[INFO] --- jib-maven-plugin:1.3.0:dockerBuild (default-cli) @ hellojib ---
[INFO] 
[INFO] Containerizing application to Docker daemon as bolingcavalry/hellojib:0.0.1-SNAPSHOT...
[INFO] The base image requires auth. Trying again for bolingcavalry/arm64jdk:8...
[INFO] 
[INFO] Container entrypoint set to [java, -Xms1g, -Xmx1g, -cp, /app/resources:/app/classes:/app/libs/*, com.bolingcavalry.hellojib.HellojibApplication]
[INFO] 
[INFO] Built image to Docker daemon as bolingcavalry/hellojib:0.0.1-SNAPSHOT
[INFO] Executing tasks:
[INFO] [==============================] 100.0% complete
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  09:59 min
[INFO] Finished at: 2019-10-02T19:42:42+08:00
[INFO] ------------------------------------------------------------------------
  1. 驗證hellojib工程的鏡像是否正常,執行命令docker run --rm -p 8080:8080 bolingcavalry/hellojib:0.0.1-SNAPSHOT,控制臺顯示SpringBoot應用啟動成功:
root@raspbian:~/test/hellojib# docker run --rm -p 8080:8080 bolingcavalry/hellojib:0.0.1-SNAPSHOT

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.6.RELEASE)

2019-10-02 11:45:02.425  INFO 1 --- [           main] c.b.hellojib.HellojibApplication         : Starting HellojibApplication on d2d856d3c623 with PID 1 (/app/classes started by root in /)
2019-10-02 11:45:02.440  INFO 1 --- [           main] c.b.hellojib.HellojibApplication         : No active profile set, falling back to default profiles: default
2019-10-02 11:45:07.203  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-10-02 11:45:07.342  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-02 11:45:07.344  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-10-02 11:45:07.761  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-10-02 11:45:07.762  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5108 ms
2019-10-02 11:45:08.863  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-02 11:45:10.027  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-02 11:45:10.037  INFO 1 --- [           main] c.b.hellojib.HellojibApplication         : Started HellojibApplication in 8.932 seconds (JVM running for 9.876)
2019-10-02 11:45:52.965  INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-10-02 11:45:52.966  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-10-02 11:45:52.993  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 27 ms
  1. ARM電腦的IP地址是192.168.50.118,因此在瀏覽器訪問:http://192.168.50.118:8080/hello ,如下圖,可見hellojib工程的容器可以正常作業,成功回傳了資料:
    在這里插入圖片描述
    SpringBoot工程終于在ARM機器的Docker環境下成功運行了,這里采用的是自制JDK8鏡像的方式,還有一種方法也是可行的,即:使用OpenJDK官方的JDK11鏡像;

使用OpenJDK官方的JDK11鏡像

使用JDK11鏡像,意味著Java工程所用的JDK從8升級到11,這個操作和Docker的關系不大,您只要驗證應用在升級JDK后是否能運行正常即可,本文就不贅述了,我把自己在升級程序中遇到的問題列出來,幫您跳過小坑:

  1. 從JDK9開始引入了module的概念,JDK8自帶的一些jar包不再默認提供,您需要在應用的pom.xml中添加以下依賴,否則SpringBoot啟動時會因為某些lass找不到導致啟動失敗:
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.1</version>
</dependency>
  1. 如果您的不想修改pom.xml,此時我的做法:
    a. 將上述三個依賴對應的jar包全部找出來(注意這里絕不止三個jar包,還有它們的間接依賴),放在ARM電腦的某個檔案夾下面,例如/usr/local/extendJar;
    b. 修改Jib插件的配置,增加一個classpath,例如:/usr/local/extendJar(注意這里的路徑是容器內的);
    c. 在啟動容器的時候,增加一個資料卷映射,將宿主機的/usr/local/extendJar映射到容器的/usr/local/extendJar;

至此,OpenJDK官方在ARM架構不提供8版本鏡像的問題已完美解決,如果您正在使用ARM服務器做Docker+Java開發,希望此文能給您一些參考,

https://github.com/zq2599/blog_demos

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/135388.html

標籤:Java

上一篇:Jaskson精講第7篇-類繼承關系下的JSON序列化與反序列化JsonTypeInfo

下一篇:「性能提升」擴展 Spring Cache 支持多級快取

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more