{"id":40547,"date":"2023-08-20T19:44:21","date_gmt":"2023-10-28T16:53:03","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/"},"modified":"2024-04-30T19:23:57","modified_gmt":"2024-04-30T11:23:57","slug":"%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/","title":{"rendered":"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206"},"content":{"rendered":"<p>\u4e0b\u4e00\u4e2a\u662f\u5173\u4e8eSpring Boot\u5f00\u53d1\u73af\u5883\u5b89\u88c5\u7684\u7b2c\u4e8c\u90e8\u5206\uff0c\u5173\u4e8e\u540e\u7aef\u7684\u90e8\u5206\u3002<br \/>\n\u5173\u4e8e\u524d\u7aef\u90e8\u5206\uff0c\u8bf7\u70b9\u51fb\u8fd9\u91cc\u3002<\/p>\n<h2>\u7ec4\u6210<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">SDKMAN<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">SpringBoot<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">gradle<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Java<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">mySQL<\/ul>\n<h1>\u6b65\u9aa4<\/h1>\n<h2>\u521b\u5efaDevContainer<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">1.VScode\u3092\u8d77\u52d5\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u9069\u5f53\u306a\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u4f5c\u6210\u3057\u3066\u3001\u305d\u306e\u30d5\u30a9\u30eb\u30c0\u30fc\u914d\u4e0b\u3067VSCode\u3092\u8d77\u52d5\u3059\u308b\u3002<\/ul>\n<pre class=\"post-pre\"><code>~$ mkdir sample-project-backend\r\n~$ cd sample-project-backend\r\n\r\nsample-project-backend$ code .\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2.VSCode\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30d1\u30cd\u30eb(ctrl + shift + P)\u304b\u3089\u3001\u300cDev containers:Add Dev Containers Configuration Files&#8230;\u300d\u3092\u9078\u629e\u3059<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">3.\u300cJava\u300d\u3092\u9078\u629e<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">4.\u300cJava\u300d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u9078\u629e(17)\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">5.CLI\u7b49\u3092\u5165\u308c\u308b\u304b\u3068\u5c0b\u306d\u3089\u308c\u308b\u306e\u3067\u3001\u4f55\u3082\u9078\u629e\u305b\u305a\u306b\u4f5c\u6210\u3092\u3059\u308b\u3002\u4ee5\u4e0b\u306e\u611f\u3058\u306b\u306a\u308c\u3070OK<\/ul>\n<pre class=\"post-pre\"><code>sample-project-backend(root)\r\n  \u2514\u2500 .devcontainer\r\n      \u2514\u2500 devcontainer.json\r\n<\/code><\/pre>\n<p>\u203b\u5982\u679c\u771f\u7684\u8981\u78ba\u4fdd\u64cd\u4f5c\u6b63\u5e38\u7684\u8a71\uff0c\u6700\u597d\u9032\u884c\u9a57\u8b49\uff0c\u4f46\u53ea\u662f\u5f9e\u5b98\u65b9\u7372\u53d6\u800c\u5df2\uff0c\u61c9\u8a72\u6c92\u554f\u984c\u7684\uff08\u7b11\uff09\u3002<\/p>\n<h2>\u81ea\u5b9a\u4e49DevContainer<\/h2>\n<p>\u6211\u60f3\u901a\u8fc7\u4f7f\u7528DockerFile\u6765\u542f\u52a8devContainer\uff0c\u6240\u4ee5\u8981\u8fdb\u884c\u4fee\u6539\u548c\u521b\u5efa\u3002<\/p>\n<ul class=\"post-ul\">1.devcontainer.json\u3092\u4fee\u6b63<\/ul>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n\t<span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"java-backend\"<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"nl\">\"dockerComposeFile\"<\/span> <span class=\"p\">:<\/span> <span class=\"s2\">\".\/compose.yml\"<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"nl\">\"service\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"java-backend\"<\/span><span class=\"p\">,<\/span>\r\n \t<span class=\"nl\">\"shutdownAction\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"stopCompose\"<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"nl\">\"workspaceFolder\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\/work\/backend\"<\/span><span class=\"p\">,<\/span>\r\n\r\n\t<span class=\"nl\">\"customizations\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"nl\">\"vscode\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t<span class=\"nl\">\"settings\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"nl\">\"editor.formatOnSave\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\r\n\t\t\t<span class=\"p\">},<\/span>\r\n\t\t\t<span class=\"nl\">\"extensions\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n\t\t\t\t<span class=\"s2\">\"mhutchie.git-graph\"<\/span><span class=\"p\">,<\/span>\r\n\t\t\t<span class=\"p\">]<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t<span class=\"p\">},<\/span>\r\n    <span class=\"nl\">\"otherPortsAttributes\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"nl\">\"onAutoForward\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"ignore\"<\/span>\r\n\t<span class=\"p\">},<\/span>\r\n\t<span class=\"nl\">\"remoteUser\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"vscode\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2.compose.yml\u3092\u4f5c\u6210\u3059\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">devcontainer.json\u304b\u3089compose.yml\u3092\u547c\u3076\u3088\u3046\u306b\u3057\u305f\u3044\u306e\u3067\u3001compose.yml\u3092\u4f5c\u6210\u3059\u308b\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">java-backend<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">java-backend<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/docker\/java<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">..:\/work\/backend:cached<\/span>\r\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sleep infinity<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">3.\u4ee5\u4e0b\u306eDockerFile\u3092\u4f5c\u6210\u3059\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u3053\u3053\u3067\u306f\u3001SDKMAN\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u305f\u3081\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3068\u3001Git\u3092\u8ffd\u52a0\u3057\u3066\u3044\u308b\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> mcr.microsoft.com\/vscode\/devcontainers\/java:17-jdk-bullseye<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>apt-get update <span class=\"o\">&amp;&amp;<\/span> apt-get <span class=\"nt\">-y<\/span> <span class=\"nb\">install <\/span>git zip unzip curl <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>curl <span class=\"nt\">-s<\/span> <span class=\"s2\">\"https:\/\/get.sdkman.io\"<\/span> | bash\r\n\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/work\/backend<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">4.\u8d77\u52d5\u3057\u3066\u78ba\u304b\u3081\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30d1\u30cd\u30eb(ctrl + shift + P)\u304b\u3089Dev Containers: Rebuild and Reoprn in container\u3092\u9078\u629e\u3059\u308b\u3002\u8d77\u52d5\u5f8c\u306bSDKMAN\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u78ba\u8a8d\u3057\u4e0b\u8a18\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308c\u3070OK<\/ul>\n<pre class=\"post-pre\"><code>sdk version \r\n\r\nSDKMAN!\r\nscript: 5.18.2\r\nnative: 0.4.3\r\n<\/code><\/pre>\n<ul class=\"post-ul\">5.\u30d5\u30a1\u30a4\u30eb\u69cb\u6210\u306f\u4ee5\u4e0b\u306e\u901a\u308a<\/ul>\n<pre class=\"post-pre\"><code>sample-project-backend(root)\r\n  \u2514\u2500 .devcontainer\r\n      \u251c\u2500 docker\r\n      \u2502   \u2514\u2500 java\r\n      \u2502       \u2514\u2500 Dockerfile\r\n      \u251c\u2500 compose.yml\r\n      \u2514\u2500 devcontainer.json\r\n<\/code><\/pre>\n<h2>\u521b\u5efa\u4e00\u4e2a Spring \u9879\u76ee\u3002<\/h2>\n<ul class=\"post-ul\">1.\u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5\u3057\u3066\u3044\u308b\u72b6\u614b\u3067\u3001Spring CLI\u304a\u3088\u3073gradle\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code>sdk install springboot 3.1.5\r\nsdk install gradle 8.4\r\n<\/code><\/pre>\n<ul class=\"post-ul\">2.Spring CLI\u3068gradle\u306e\u78ba\u8a8d\u3092\u3057\u3066\u3001\u4e0b\u8a18\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3002<\/ul>\n<pre class=\"post-pre\"><code>$ spring --version\r\n\r\nSpring CLI v3.1.5\r\n\r\n$ gradle --version\r\n\r\n------------------------------------------------------------\r\nGradle 8.4\r\n------------------------------------------------------------\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">3.\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u4e0b\u8a18\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u3092\u884c\u3044\u307e\u3059\u3002\u2193\u8efd\u304f\u8aac\u660e<\/ul>\n<\/li>\n<\/ul>\n<p>gradle\u306e\u4f9d\u5b58\u95a2\u4fc2\u306bspring-boot-starter-web\u3092\u6ce8\u5165<br \/>\n\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306fgradle(java)\u3092\u4f7f\u7528<br \/>\nJava\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a(17)<br \/>\n\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3092sample-app\u3068\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>$ spring init -d=web --type=gradle-project -j=21.0.1 -n=sample-app sample-app \r\nUsing service at https:\/\/start.spring.io\r\nProject extracted to '\/work\/backend\/sample-app'\r\n\r\n$ mv sample-app\/* .\/. \r\n<\/code><\/pre>\n<p>\u5c3d\u7ba1\u5df2\u7ecf\u8fdb\u884c\u4e86\u4e00\u4e9b\u66f4\u6539\uff0c\u4f46build.gradle\u6587\u4ef6\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">plugins<\/span> <span class=\"o\">{<\/span>\r\n\t<span class=\"n\">id<\/span> <span class=\"s1\">'java'<\/span>\r\n\t<span class=\"n\">id<\/span> <span class=\"s1\">'org.springframework.boot'<\/span> <span class=\"n\">version<\/span> <span class=\"s1\">'3.1.5'<\/span>\r\n\t<span class=\"n\">id<\/span> <span class=\"s1\">'io.spring.dependency-management'<\/span> <span class=\"n\">version<\/span> <span class=\"s1\">'1.1.3'<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"n\">group<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'com.example'<\/span>\r\n<span class=\"n\">version<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'0.0.1-SNAPSHOT'<\/span>\r\n\r\n<span class=\"n\">java<\/span> <span class=\"o\">{<\/span>\r\n\t<span class=\"n\">toolchain<\/span><span class=\"o\">{<\/span>\r\n\t\t<span class=\"n\">languageVersion<\/span> <span class=\"o\">=<\/span> <span class=\"n\">JavaLanguageVersion<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"mi\">17<\/span><span class=\"o\">)<\/span>\r\n\t<span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"k\">repositories<\/span> <span class=\"o\">{<\/span>\r\n\t<span class=\"n\">mavenCentral<\/span><span class=\"o\">()<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"k\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n\t<span class=\"n\">implementation<\/span> <span class=\"s1\">'org.springframework.boot:spring-boot-starter-web'<\/span>\r\n\t<span class=\"n\">testImplementation<\/span> <span class=\"s1\">'org.springframework.boot:spring-boot-starter-test'<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"n\">tasks<\/span><span class=\"o\">.<\/span><span class=\"na\">named<\/span><span class=\"o\">(<\/span><span class=\"s1\">'bootBuildImage'<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n\t<span class=\"n\">builder<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'paketobuildpacks\/builder-jammy-base:latest'<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"n\">tasks<\/span><span class=\"o\">.<\/span><span class=\"na\">named<\/span><span class=\"o\">(<\/span><span class=\"s1\">'test'<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n\t<span class=\"n\">useJUnitPlatform<\/span><span class=\"o\">()<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">4.\u3072\u3068\u307e\u305a\u52d5\u4f5c\u78ba\u8a8d<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u4e0b\u8a18\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3068\u308a\u3042\u3048\u305a\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u52d5\u304b\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/ul>\n<pre class=\"post-pre\"><code>$ gradle bootRun\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u9879\u76ee\u4e2d\u6ca1\u6709\u4efb\u4f55\u5185\u5bb9\uff0c\u6211\u8ba4\u4e3a\u5728http:\/\/localhost:8080\/\u4e0a\u8fdb\u884c\u786e\u8ba4\u65f6\u4f1a\u663e\u793a\u5982\u4e0b\u754c\u9762\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d40d537434c4406c93ca0\/34-0.png\" alt=\"backend_SpringInit_\u30c7\u30d5\u30a9\u30eb\u30c8.PNG\" \/><\/div>\n<p>5.\u3053\u3053\u304b\u3089\u304a\u306a\u3058\u307f\u306eHello World\u3092\u8868\u793a\u3059\u308b\u3088\u3046\u306b\u4fee\u6b63\u3057\u307e\u3059\u3002<\/p>\n<p>VsCode\u306b\u3066ctrl \uff0b C\u3092\u62bc\u4e0b\u3057\u3066\u52d5\u4f5c\u4e2d\u306egradle\u3092\u6b62\u3081\u308b<\/p>\n<p>src\/main\/java\/com\/example\/sampleapp\/SampleAppApplication \u4e0b\u8a18\u5909\u66f4\u3092\u9069\u7528\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.sampleapp<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.SpringApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.SpringBootApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"hil\"><span class=\"o\">+ <\/span><span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RequestMapping<\/span><span class=\"o\">;<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span><span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RestController<\/span><span class=\"o\">;<\/span>\r\n<\/span>\r\n<span class=\"hil\"><span class=\"o\">+ <\/span><span class=\"nd\">@RestController<\/span>\r\n<\/span><span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SampleAppApplication<\/span> <span class=\"o\">{<\/span>\r\n\r\n<span class=\"hil\"><span class=\"o\">+\t<\/span><span class=\"nd\">@RequestMapping<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+\t<\/span><span class=\"nc\">String<\/span> <span class=\"nf\">SayHello<\/span><span class=\"o\">(){<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+\t<\/span>\t<span class=\"k\">return<\/span> <span class=\"s\">\"Hello World\"<\/span><span class=\"o\">;<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+\t}<\/span>\r\n<\/span>\t<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n\t\t<span class=\"nc\">SpringApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">SampleAppApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span> <span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n\t<span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">6.\u518d\u5ea6\u52d5\u4f5c\u78ba\u8a8d<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">http:\/\/localhost:8080\/\u3067Hello World\u304c\u8868\u793a\u3055\u308c\u308c\u3070OK!!!<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u3053\u306e\u6642\u70b9\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306f\u4ee5\u4e0b\u306e\u901a\u308a<\/ul>\n<pre class=\"post-pre\"><code>sample-project-backend(root)\r\n  \u251c\u2500 .devcontainer\r\n  \u2502   \u251c\u2500 docker\r\n  \u2502   \u2502   \u2514\u2500 java\r\n  \u2502   \u2502       \u2514\u2500 Dockerfile\r\n  \u2502   \u251c\u2500 compose.yml\r\n  \u2502   \u2514\u2500 devcontainer.json\r\n  \u2502\r\n  \u251c\u2500 src\r\n  \u2502   \u251c\u2500 main\r\n  \u2502   \u2502   \u251c\u2500 resources\r\n  \u2502   \u2502   \u2502   \u251c\u2500 static\r\n  \u2502   \u2502   \u2502   \u251c\u2500 templates\r\n  \u2502   \u2502   \u2502   \u2514\u2500 application.properties\r\n  \u2502   \u2502   \u2514\u2500 java\r\n  \u2502   \u2502       \u2514\u2500 com   \r\n  \u2502   \u2502           \u2514\u2500 example  \r\n  \u2502   \u2502               \u2514\u2500 sampleapp\r\n  \u2502   \u2502                   \u2514\u2500 SampleAppApplication.java\r\n  \u2502   \u2514\u2500 test\r\n  \u2502   \u2502   \u2514\u2500 java\r\n  \u2502   \u2502      \u2514\u2500 com   \r\n  \u2502   \u2502          \u2514\u2500 example  \r\n  \u2502   \u2502              \u2514\u2500 sampleapp\r\n  \u2502   \u2502                  \u2514\u2500 SampleAppApplication.java\r\n  \u2502\r\n  \u251c\u2500 gradle\r\n  \u2502   \u251c\u2500 gradle-wrapper.jar\r\n  \u2502   \u2514\u2500 gradle-wrapper.properties\r\n  \u2502\r\n  \u251c\u2500 .gradle\/* # \u9577\u3044\u306e\u3067\u4e2d\u8eab\u5272\u611b\r\n  \u2502   \r\n  \u251c\u2500 build\/*   # \u9577\u3044\u306e\u3067\u4e2d\u8eab\u5272\u611b \r\n  \u251c\u2500 .gitignore\r\n  \u251c\u2500 build.gradle\r\n  \u251c\u2500 gradlew\r\n  \u251c\u2500 gradlew.bat\r\n  \u251c\u2500 README.md\r\n  \u2514\u2500 setting.gradle\r\n<\/code><\/pre>\n<h2>MySQL\u7684\u5efa\u8bbe<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">1.mySQL\u7528\u306e\u30b3\u30f3\u30c6\u30ca\u306e\u8ffd\u52a0<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30c7\u30fc\u30bf\u3092\u4fdd\u7ba1\u3059\u308b\u305f\u3081\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u3057\u3066\u4eca\u56de\u306fmySQL\u3092\u4f7f\u7528\u3059\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u4e0b\u8a18\u306e\u3088\u3046\u306bcompose.yml\u3092\u8ffd\u52a0\u3057\u3066\u3001mySQL\u7528\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u7acb\u3061\u4e0a\u3052\u308b\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">java-backend<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">java-backend<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/docker\/java<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">..:\/work\/backend:cached<\/span>\r\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sleep infinity<\/span>\r\n<span class=\"hil\"><span class=\"na\">+    depends_on<\/span><span class=\"pi\">:<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>     <span class=\"pi\">-<\/span> <span class=\"s\">mysql<\/span>\r\n<\/span><span class=\"hil\"><span class=\"s\">+<\/span>  \r\n<\/span><span class=\"hil\"><span class=\"na\">+  mysql<\/span><span class=\"pi\">:<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>   <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">java-backend-mysql<\/span>\r\n<\/span><span class=\"hil\"><span class=\"na\">+    build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/docker\/mysql<\/span>\r\n<\/span><span class=\"hil\"><span class=\"na\">+    env_file<\/span><span class=\"pi\">:<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>     <span class=\"pi\">-<\/span> <span class=\"s\">.\/docker\/mysql\/.env<\/span>\r\n<\/span><span class=\"hil\"><span class=\"na\">+    ports<\/span><span class=\"pi\">:<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>     <span class=\"pi\">-<\/span> <span class=\"s\">3306:3306<\/span>\r\n<\/span><span class=\"hil\"><span class=\"na\">+    volumes<\/span><span class=\"pi\">:<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>     <span class=\"pi\">-<\/span> <span class=\"s\">db-store:\/var\/lib\/mysql<\/span>\r\n<\/span><span class=\"hil\"><span class=\"s\">+<\/span>\r\n<\/span><span class=\"hil\"><span class=\"na\">+volumes<\/span><span class=\"pi\">:<\/span> \r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span> <span class=\"na\">spring-store<\/span><span class=\"pi\">:<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span> <span class=\"na\">spring-logs<\/span><span class=\"pi\">:<\/span>\r\n<\/span><\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2.\u30d3\u30eb\u30c9\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0\u3059\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">compose.yml\u306b\u76f4\u63a5\u8a18\u8f09\u3057\u3066\u3082\u3088\u3044\u3067\u3059\u304c\u3001\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3084\u3059\u3044\u3088\u3046\u306bDockerfile\u304a\u3088\u3073.env\u3092\u8ffd\u52a0\u3059\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u203b\u305d\u3082\u305d\u3082\u30d5\u30a9\u30eb\u30c0\u30fc\u304c\u306a\u3044\u3068\u601d\u3046\u306e\u3067\u3001\u30d5\u30a9\u30eb\u30c0\u30fc\u3082\u4f75\u305b\u3066\u4f5c\u6210\u3092\u304a\u9858\u3044\u3057\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> mysql:8.0.30<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>TZ=Asia\/Tokyo\r\n\r\nMYSQL_DATABASE=spring_db\r\nMYSQL_USER=spring\r\nMYSQL_PASSWORD=password\r\nMYSQL_ROOT_PASSWORD=password\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">3.\u758e\u901a\u78ba\u8a8d<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u758e\u901a\u78ba\u8a8d\u3092\u3059\u308b\u305f\u3081\u306b\u3001mysql-client\u3092\u5165\u308c\u3066\u52d5\u4f5c\u78ba\u8a8d\u3059\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30e1\u30a4\u30f3\u306e\u30b3\u30f3\u30c6\u30ca\u7528Dockerfile\u3092\u5c11\u3057\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> mcr.microsoft.com\/vscode\/devcontainers\/java:1-21-bullseye<\/span>\r\n\r\n<span class=\"hdl\"><span class=\"o\">- <\/span>RUN apt-get update &amp;&amp; apt-get -y install git zip unzip curl &amp;&amp; \\\r\n<\/span><span class=\"hil\">+ RUN apt-get update &amp;&amp; apt-get -y install git zip unzip curl default-mysql-client  &amp;&amp; \\\r\n<\/span>curl -s \"https:\/\/get.sdkman.io\" | bash\r\n\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/work\/backend<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u80fd\u5728\u91cd\u65b0\u6784\u5efa\u5e76\u542f\u52a8\u5bb9\u5668\u540e\uff0c\u4f7f\u7528\u547d\u4ee4\u51fa\u73b0\u4ee5\u4e0b\u7c7b\u4f3c\u7684\u63d0\u793a\uff0c\u5373\u8868\u793a\u6210\u529f\u3002<\/p>\n<pre class=\"post-pre\"><code>$ mysql -h java-backend-mysql -u spring -ppassword\r\nWelcome to the MariaDB monitor.  Commands end with ; or \\g.\r\nYour MySQL connection id is 8\r\nServer version: 8.0.30 MySQL Community Server - GPL\r\n\r\nCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.\r\n\r\nType 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\r\n<\/code><\/pre>\n<h2>\u5176\u4ed6\u7684\u5b9a\u5236\u9009\u9879<\/h2>\n<p>\u958b\u767c\u74b0\u5883\u7684\u5efa\u7acb\u5df2\u7d93\u5b8c\u6210\uff0c\u4f46\u5728\u958b\u767c\u904e\u7a0b\u4e2d\u53ef\u80fd\u6709\u4e00\u4e9b\u65b9\u4fbf\u7684\u8abf\u6574\uff0c\u6211\u5011\u5c07\u8a18\u9304\u4e0b\u4f86\u3002<\/p>\n<h3>\u6dfb\u52a0\u8c03\u8bd5\u529f\u80fd<\/h3>\n<p>\u5982\u679c\u4f60\u4f7f\u7528VSCode\uff0c\u5728\u4fa7\u8fb9\u680f\u9009\u62e9Run and Debug(ctrl + shift + D)\uff0c\u5982\u679c\u662f\u7b2c\u4e00\u6b21\u4f7f\u7528\uff0c\u5219\u9009\u62e9create a launch.json file\uff0c\u8fd9\u6837\u5c31\u4f1a\u751f\u6210\u4e0b\u9762\u7684\u7528\u4e8eJava\u7684json\u6587\u4ef6\uff0c\u4ece\u800c\u4f7f\u5f97debug\u529f\u80fd\u53ef\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"version\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"0.2.0\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"configurations\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"nl\">\"type\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"java\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"Current File\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"request\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"launch\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"mainClass\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"${file}\"<\/span>\r\n        <span class=\"p\">},<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"nl\">\"type\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"java\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"SampleAppApplication\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"request\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"launch\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"mainClass\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"com.example.sampleapp.SampleAppApplication\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"projectName\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"backend\"<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u81ea\u52a8\u5316\u5b89\u88c5Spring\/Gradle\u3002<\/h3>\n<p>\u6839\u636e\u4e0d\u540c\u60c5\u51b5\uff0c\u5bb9\u5668\u6709\u65f6\u5019\u65e0\u6cd5\u5de5\u4f5c\uff0c\u9700\u8981\u7ecf\u5e38\u91cd\u542f\u5bb9\u5668\u3002\u6bcf\u6b21\u90fd\u5728\u7ec8\u7aef\u91cd\u65b0\u5b89\u88c5SpringBoot\u548cGradle\u662f\u5f88\u9ebb\u70e6\u7684\u3002\u867d\u7136\u4ec5\u4ec5\u662f\u4e00\u4e2a\u4f8b\u5b50\uff0c\u4f46\u53ef\u4ee5\u901a\u8fc7\u5728\u5bb9\u5668\u542f\u52a8\u65f6\u6267\u884cShell\u811a\u672c\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#8221;createCommand.sh&#8221;\u7684\u6267\u884c\u6587\u4ef6\uff0c\u5e76\u5728&#8221;devcontainer.json&#8221;\u4e2d\u8c03\u7528\u5b83\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#!\/bin\/bash<\/span>\r\n\r\n<span class=\"c\"># \u4e00\u6642\u7684\u306bSDK\u306e\u30d1\u30b9\u3092\u901a\u3059<\/span>\r\n<span class=\"nb\">source<\/span> <span class=\"s2\">\"\/usr\/local\/sdkman\/bin\/sdkman-init.sh\"<\/span>\r\n\r\n<span class=\"c\"># spring\/gradle\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\nsdk <span class=\"nb\">install <\/span>springboot 3.1.5\r\nsdk <span class=\"nb\">install <\/span>gradle 8.4\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"hil\"><span class=\"o\">+\t<\/span><span class=\"nl\">\"postCreateCommand\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"bash .devcontainer\/createCommand.sh\"<\/span>\r\n<\/span><\/code><\/pre>\n<h3>\u5c06UTC\u6807\u51c6\u65f6\u95f4\u8c03\u6574\u4e3a\u65e5\u672c\u65f6\u95f4\u3002<\/h3>\n<p>\u867d\u7136\u7b80\u5355\uff0c\u4f46\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8bbe\u7f6e\u65f6\u533a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"hil\"><span class=\"o\">+ <\/span>ENV TZ=Asia\/Tokyo\r\n<\/span><\/code><\/pre>\n<h3>\u6dfb\u52a0\u6269\u5c55\u529f\u80fd<\/h3>\n<p>\u5728VSCode\u4e2d\uff0c\u60a8\u53ef\u4ee5\u9009\u62e9\u5404\u79cd\u6269\u5c55\u529f\u80fd\u3002<br \/>\n\u901a\u8fc7\u9009\u62e9\u5de6\u4fa7\u8fb9\u680f\u4e2d\u7684EXTENSIONS(ctrl + shift + X)\uff0c\u60a8\u53ef\u4ee5\u67e5\u770b\u6269\u5c55\u529f\u80fd\u7684\u5217\u8868\uff0c\u5e76\u9009\u62e9\u5b89\u88c5\u3002\u6b64\u5916\uff0c\u60a8\u8fd8\u53ef\u4ee5\u901a\u8fc7\u9009\u62e9\u9f7f\u8f6e\u56fe\u6807\u5e76\u9009\u62e9\u590d\u5236\u6269\u5c55ID\u6765\u5c06\u5176\u6dfb\u52a0\u5230devcontainer.json\u4e2d\uff0c\u5728\u5bb9\u5668\u542f\u52a8\u65f6\u81ea\u52a8\u5b89\u88c5\u3002<br \/>\n\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a<\/p>\n<pre class=\"post-pre\"><code>\t<span class=\"nl\">\"customizations\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"nl\">\"vscode\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t<span class=\"nl\">\"extensions\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n\t\t\t\t<span class=\"s2\">\"mhutchie.git-graph\"<\/span><span class=\"p\">,<\/span>\r\n\t\t\t\t<span class=\"s2\">\"vscjava.vscode-gradle\"<\/span><span class=\"p\">,<\/span>\r\n\t\t\t\t<span class=\"s2\">\"mikestead.dotenv\"<\/span><span class=\"p\">,<\/span>\r\n\t\t\t\t<span class=\"s2\">\"cweijan.vscode-mysql-client2\"<\/span>\r\n\t\t\t<span class=\"p\">]<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u53c2\u8003\u8d44\u6599<\/h2>\n<ul class=\"post-ul\">Spring \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8 \u5165\u9580\u30bb\u30af\u30b7\u30e7\u30f3<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0b\u4e00\u4e2a\u662f\u5173\u4e8eSpring Boot\u5f00\u53d1\u73af\u5883\u5b89\u88c5\u7684\u7b2c\u4e8c\u90e8\u5206\uff0c\u5173\u4e8e\u540e\u7aef\u7684\u90e8\u5206\u3002 \u5173\u4e8e\u524d\u7aef\u90e8\u5206\uff0c\u8bf7\u70b9\u51fb\u8fd9\u91cc\u3002 \u7ec4\u6210  [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40547","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5728devcontainer\u4e2d\u521b\u5efanextreact-springbootjava\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206\" \/>\n<meta property=\"og:description\" content=\"\u4e0b\u4e00\u4e2a\u662f\u5173\u4e8eSpring Boot\u5f00\u53d1\u73af\u5883\u5b89\u88c5\u7684\u7b2c\u4e8c\u90e8\u5206\uff0c\u5173\u4e8e\u540e\u7aef\u7684\u90e8\u5206\u3002 \u5173\u4e8e\u524d\u7aef\u90e8\u5206\uff0c\u8bf7\u70b9\u51fb\u8fd9\u91cc\u3002 \u7ec4\u6210 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5728devcontainer\u4e2d\u521b\u5efanextreact-springbootjava\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-28T16:53:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T11:23:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d40d537434c4406c93ca0\/34-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u9896\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u9896\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/\",\"name\":\"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-10-28T16:53:03+00:00\",\"dateModified\":\"2024-04-30T11:23:57+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\",\"name\":\"\u79d1, \u9896\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u9896\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5728devcontainer\u4e2d\u521b\u5efanextreact-springbootjava\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206","og_description":"\u4e0b\u4e00\u4e2a\u662f\u5173\u4e8eSpring Boot\u5f00\u53d1\u73af\u5883\u5b89\u88c5\u7684\u7b2c\u4e8c\u90e8\u5206\uff0c\u5173\u4e8e\u540e\u7aef\u7684\u90e8\u5206\u3002 \u5173\u4e8e\u524d\u7aef\u90e8\u5206\uff0c\u8bf7\u70b9\u51fb\u8fd9\u91cc\u3002 \u7ec4\u6210 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5728devcontainer\u4e2d\u521b\u5efanextreact-springbootjava\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-10-28T16:53:03+00:00","article_modified_time":"2024-04-30T11:23:57+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d40d537434c4406c93ca0\/34-0.png"}],"author":"\u79d1, \u9896","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u9896","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/","name":"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-10-28T16:53:03+00:00","dateModified":"2024-04-30T11:23:57+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5728devContainer\u4e2d\u521b\u5efaNext(React) + SpringBoot(Java)\u7684\u5f00\u53d1\u73af\u5883\uff0c\u540e\u7aef\u90e8\u5206"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e","name":"\u79d1, \u9896","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","caption":"\u79d1, \u9896"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8devcontainer%e4%b8%ad%e5%88%9b%e5%bb%banextreact-springbootjava%e7%9a%84%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%ef%bc%8c%e5%90%8e%e7%ab%af%e9%83%a8%e5%88%86%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40547","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40547"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40547\/revisions"}],"predecessor-version":[{"id":93819,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40547\/revisions\/93819"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40547"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40547"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40547"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}