IDEA生成的Spring Boot文件分析及打包小结

深入Spring Boot :打包解决方案 因为spring-boot-starter-parent pom.xml中已经帮我们管理好了打包需要用到的spring-boot-maven-plugin插件和它需要依赖的其它插件,所以通过继承可以直接使用spring-boot-maven-plugin。有时,我们的项目有自己的parent pom.xml,此时没有继承spring-boot-starter-parent,那么如果还要想使用spring-boot-maven-plugin插件,就需要自定义管理它所依赖的maven插件。... 阅读详情

一、文件目录结构

使用IDEA生成的Spring Boot工程结构如上图所示。该目录是一个符合maven目录结构的maven程序,包含src目录和pom.xml文件,还包含mvnw,mvnw.cmd,.mvn文件。

.mvn 、mvnw、mvnw.cmd提供构建maven项目的所需文件。mvnw是运行mvn命令的winds脚本文件。其中mvnw是适合Linux平台的脚本文件。mvnw 全名是maven wrapper,它的原理是在maven-wrapper.properties文件中记录你要使用的maven版本,当用户执行mvnw clean 命令时,发现当前用户的maven版本和期望的版本不一致,那么就下载期望的版本,然后用期望的版本来执行mvn命令,比如刚才的mvn clean。

如果你本机安装了maven则直接使用mvn命令,不必理会其它文件,只需关注src和pom.xml就可以。

为工项目添加mvnw支持有两种方式:

1.在pom.xml中添加plugin声明


<plugin>
    <groupId>com.rimerosolutions.maven.plugins</groupId>
    <artifactId>wrapper-maven-plugin</artifactId>
    <version>0.0.4</version>
</plugin>

这样当我们执行mvn wrapper:wrapper时,会帮我们生成mvnw.bat, mvnw, maven/maven-wrapper.jar, maven/maven-wrapper.properties这些文件。然后我们就可以使用mvnw代替mvn命令执行所有的maven命令。

2.直接执行goal

#表示我们期望使用的maven的版本为3.3.3
mvn -N io.takari:maven:wrapper -Dmaven=3.3.3

产生的内容和第一种方式是一样的,只是目录结构不一样,maven-wrapper.jar和maven-wrapper.properties在.mvn/wrapper目录下。

IDEA和Spring Boot官网生成的Spring Boot工程都是这种形式的。

二、打包总结

Spring Boot下打包过程

基于IDEA创建的工程项目中已经创建好了相应的配置文件和信息具体的文件如上面所示的目录结构图。其中的

-** mvnw, mvnw.cmd 此为对mvn命令的封装 
-** pom.xml maven项目的配置文件 

-** mvn clean : 删除target目录内容,清理打包痕迹 
-** mvn compile 编译项目,查看是否有语法或者依赖问题 
-** mvn package 打包当下的项目

-DskipTests主要用以调过测试用例的执行,如果不加上面的参数,则会执行测试目录下的测试程序。 

这里写图片描述

Spring Boot打包结果内容

Spring boot中打出的包主要有如下信息: 
-** Boot-INF 主要的类库信息,以及项目代码编译的class所在位置 
-** META-INF 关于当下应用的配置信息,比如Spring,以及maven的信息 
-** org目录, 其中为可执行jar或者war中所需要的相关信息 

Spring Boot中的Maven插件介绍

Spring Boot的pom文件中只有一个缺省的plugins

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

在spring boot maven中已经集成了若干必须的插件信息,可以直接使用。如果需要的话,可以自行添加注入相关插件即可

如何使用jar命令来打包

jar cvf mq.jar -C target/classes 
jar cvf mq-0.0.1-SNAPSHOT.jar -C target\classes\ .

target/classes表示单个jar,打特定目录的文件。-C是指切换到指定的目录下,然后执行jar的打包命令.

 

 

 

 

idea spring boot 使用maven-plugin插件打包 首页需要需改pom.xml文件的packaging : &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;packaging&gt;war&lt;/packaging&gt; 添加外部运行的tomcat依赖: &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&l... 阅读详情

相关推荐

使用IntelliJ IDEA中的Spring Initializr来快速构建Spring Boot/Cloud工程

我相信许多初学者都看了Spring Boot和Spring Cloud相关的博文中,都会涉及Spring Boot工程的创建的问题。而一般所看到的都是使用IntelliJ IDEA 工具来创建,并且方便许多,而创建的方式多种多样之前我是通过Maven来手工构建,也可以通过SPRING INITIALIZR页面工具来创建,相信每一个人都有自己喜欢而熟练的方式。接下来介绍嵌入在的IntelliJ

_William_Cheung的博客 3万+

mvnw

mvnw是maven warpper,它的原理是在maven-wrapper.properties文件中记录你要使用的maven版本,当用户执行mvnw clean命令时,发现当前用户的maven版本和期望的版本不一致,那么就下载期望的版本。 为工项目添加mvnw支持有两种方式: (1)在pom.xml中添加plugin声明 &lt;plugin&gt; &lt;groupId&g...

金溪的博客 4371

IDEA结合spring-boot-maven-plugin如何打jar包

       工程采用IDEA作为开发工具,通过spring-boot-maven-plugin插件进行打包。在与工程相应的pom.xml文件添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 jar文件,使用“java -jar”命令就可以直接运行。添加的插件如下图1所示。图1      在操作打包之前,请确保IDEA导入的工程无误,且MAVEN库也同步更新...

qq_41823385的博客 1万+

Mvnw 简介

Mvnw 简介 8月 17, 2016 |Nix.Huang 背景 maven是一款非常流行的java项目构建软件,它集项目的依赖管理、测试用例运行、打包、构件管理于一身,是我们工作的好帮手,maven飞速发展,它的发行版本也越来越多,如果我们的项目是基于maven构件的,那么如何保证拿到我们项目源码的同事的maven版本和我们开发时的版本一致呢,可能你认为很简单,一个...

weixin_30649641的博客 634

maven-wrapper-plugin:Apache Maven包装器插件

贡献给 您已发现错误或对超酷的新功能有任何想法? 贡献代码是将某些东西还给开源社区的好方法。 在深入研究代码之前,我们需要一些准则供贡献者遵循,以便我们有机会掌握最新知识。 入门 确保您拥有。 确保您具有。 如果您打算实施一项新功能,则有必要先在上讨论您的更改。 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题不存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上分叉存储库。 进行和提交更改 我们通过GitHub接受拉取请求。 是贡献者交流的主要渠道。 有一些准则可使

PaddleOCR实战:从零开始打造专属OCR模型的完整指南

本文提供了一份从零开始使用PaddleOCR打造专属OCR模型的完整实战指南。内容涵盖环境搭建、数据标注与准备、模型训练与调优,以及最终的模型转换与部署。重点介绍了如何利用PaddleOCR进行模型训练,并整合PPOCRLabel等工具高效准备数据集,帮助开发者快速构建适用于特定场景的高精度OCR识别能力。

rl6adventurer的博客 733

gradle--使用Idea打包SpringBoot项目--方法/实例

gradle是后端开发常用的构建工具,本文用实例介绍如何使用maven打包SpringBoot项目。

IT利刃出鞘的博客 9004

【UE5】多用户协同编辑实战:从配置到实时协作

本文详细介绍了在虚幻引擎5中配置和使用多用户协同编辑功能的完整流程。从启用Multi-User Editing插件、配置UDP Messaging网络通信,到启动服务器、创建会话并实现实时协作,提供了从环境准备到实战协作的清晰指南。文章还分享了资产同步、场景分批、对象锁定等实用技巧,并强调了网络配置与版本一致性等关键避坑点,旨在帮助中小型团队提升关卡设计和原型开发的协作效率。

weixin_29001683的博客 267

IDEA项目打包几种方式

IDEA项目打包几种方式 第一种,最常见的使用maven, 项目的pom文件中引入spring-boot-maven-plugin插件 <build> <finalName>文件名称</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId>

qq_43021813的博客 6万+

突破Cloudflare 5秒盾!Python爬虫+GPT分析JS混淆实战(附完整代码)

这篇文章的核心观点其实不是“怎么过CF”,而是如何把LLM嵌入逆向工程的工作流。AI不会取代逆向工程师,但它正在重新定义逆向工程师的工作方式。过去我们80%的时间花在读懂混淆代码上,现在这部分可以外包给GPT,我们把精力集中在架构判断、异常处理和系统设计这些真正需要人类直觉的地方。技术会变,CF的防护会升级,GPT的能力也会迭代。但这种“人机协作拆解复杂问题”的方法论,比任何具体的绕过技巧都更有长期价值。参考资料Cloudflare Bot Management官方文档。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 536

粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解

粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等开发的一种新的进化算法(Evolutionary Algorithm - EA)。

猫敷雪 893

Spring Boot项目打包和运行

本文讲述了如何将Spring Boot项目打包成 JAR 包和 WAR 包并运行。

Merlin5815的博客 5638

【ComfyUI】Wan2.2 Rapid-AIO-Mega 二次元文生视频

通过 SD3 采样体系与 Wan 系列专用的 **WanVaceToVideo** 视频生成节点,整个流程从模型加载、文案编码、潜空间采样到视频合成一气呵成,能够稳定输出画面精致、角色统一、光影氛围鲜明的动态画面。这套工作流重点整合了视频长度、帧率、分辨率等核心参数控制,并结合 KSampler 的细节生成能力,旨在让用户能在 ComfyUI 中快速生成高质量的二次元叙事视频。

Mr数据杨 1983

IDEA 2019 生成Spring Boot项目,编写第一个Hello World程序,并打包成jar

IDEA集成了生成Spring Boot项目的功能,不需要你去 start.spring.io 上下载,使用方法如下:

个人博客 3457

OpenClaw + Antigravity + 飞书完整部署教程

在 Linux 服务器上部署 OpenClaw,使用 Antigravity 本地代理 AI 模型,并接入飞书实现 24 小时在线 AI 助手。

Maynor的博客 1788

【推荐100个unity插件】性能极高的逼真爆炸、火焰和烟雾效果——UNI VFX

这是一篇关于Unity中高性能GPU粒子特效插件UNI VFX的使用指南。文章介绍了该插件提供逼真的爆炸、火焰和烟雾效果,支持URP和HDRP渲染管线。主要内容包括:插件安装方法(需预先安装Visual Effect Graph和Shader Graph包)、事件系统使用方法(如create/loop/stop等事件控制)、特效分类(自动结束型和持续型特效)、检视面板配置技巧以及性能优化建议(特别提醒灯光特效对性能的影响较大)。文末还推荐了多个Unity开发相关的专栏内容。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1490

IDEA把spring-boot项目打包成jar

1.打开项目,然后右击项目选中‘Open Module Settings’进入project Structure( 快捷键 Ctrl+Shift+Alt+S),选中‘Artifacts’,点击中间的绿色+号,如下图所示2.弹出‘Create JAR from Modules’,选择‘Main Class’然后点击OK,设置完毕3.开始打包...

sinat_33201781的博客 2万+

C++程序无法正常启动(报0xc000007b错误)问题的详细排查

本文详细介绍了应用程序启动时遇到0xC000007B错误的排查过程。问题源于32位程序与64位运行时库的不匹配,以及缺少依赖的运行时库。通过分析系统日志、使用Windbg和检查程序位数,最终确定问题在于32位程序误引用了64位系统目录下的库文件。

dvlinker的技术专栏 1万+

IDEA生成spring boot项目jar包

IDEA生成spring boot项目jar包 刚上手IDEA做sping boot项目,学习过程中遇到一些坑,具体我也不清楚为什么IDEA的默认项生成jar包会产生这些问题,但经过以下折腾后的确可以解决问题,所以先记录。 用IDEA打开一个spring boot项目: File>project structure: project settings > Artifacts选项卡中点加号: 依次选择JAR > From modules… 然后是重点: 这里必须像上图这样设置:

梦幻天空 2202

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

28.IDEA 专业版创建 Spring Boot 项目并打包为 jar 运行

至此,已完成 Spring Boot 项目的创建、打包和运行。把.jar复制到物理机,java -jar可直接运行起网站。

Alsn86的博客 1075

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA 打包、Spring Boot Maven plugin 打包可执行 Jar、war 程序

目录 Java SE 应用 Java FX应用 结束 jar 程序 解决 "没有主清单属性" 报错 Spring Boot Maven plugin 打包应用 Java SE 项目通常会用来封装工具类,此时如果要打包(Jar包),建议使用 Maven 更加简单,本文不做描述 Java SE 项目如果使用了awt、swing,Java FX,则可以用来做GUI程序;否则可以做普通的后台...

蚩尤后裔-汪茂雄 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA中打包Spring Boot项目所需配置

初次在IDEA中使用maven打包Spring Boot工程时,遇到了一些问题,打包出来的Spring Boot jar包始终无法运行。网上也介绍了很多了方法,但问题依旧存在。终于在spring-boot-maven-plugin引入中加入extension得以解决问题。

fish2005的专栏 742

关于Idea中spring boot项目打包为可运行jar的方法 package spring-boot:repackage

在idea中

qq_26527611的博客 1890

IDEA打包spring boot 项目(打成jar包)

1、打开file→选择Project Structure 2、打开artifacts→点击+号 3、 4、选module、main class等 注:第4步,将第4步main\java去掉,不然会报如下错误:****中没有主清单属性。。改成如下: 5、如果报如下错误,表示META-INF/MANIFEST.MF文件在该目录下已存在,去删除该文件,在保持即可! 6...

Tastill的博客 1631
上一篇: Spring Cloud Bus自动更新Config Client配置
下一篇: Spring Boot工程打dockers镜像com.spotify:docker-maven-plugin 报localhost:2375 Connection refused 错误
LuckyJiang.2021
博客等级 码龄15年 217粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyJiang.2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值