Ant 编译模式与Spring MVC

Spring MVC @RequestMapping 深度解析:从路径映射到生产避坑 @RequestMapping 是 Spring MVC 请求分发的核心机制,其本质是 DispatcherServlet 对 URL 路径、HTTP 方法、请求头与查询参数的多维匹配引擎。它基于类级与方法级映射的树状组合实现 API 版本管理与模块隔离,通过 headers 和 params 属性支持内容协商与请求分流,并与 @PathVariable、@RequestParam 共同构成参数绑定体系。该机制直接影响接口健壮性、可维护性与灰度发布能力,在金融、IoT、电商等高要求场景中尤为关键。本文聚焦真 阅读详情
在实际项目过程中,很多同学都会在本地IDE进行调试开发,采用构建工具进行打包编译发布测试环境。
公司有个上古项目,用的是Eclipse进行开发,构建采用Ant脚本,一直都很正常,没出过什么问题,直到最近在这个项目中开始运用SpringMVC。
直接说问题现象
在本地调试的好用的url映射,发布到测试环境完全找不到此url,而且无任何异常报出。

代码如下:
@RequestMapping("changeJobStatus")
@ResponseBody
publicHashMapchangeJobStatus(HttpServletRequestrequest,intjobId, String cmd)

检查各种配置,无任何问题,反编译代码与本地进行对比,一模一样。
于是怀疑Ant的编译模式与Eclipse编译模式有区别导致,但是ant编译参数巨多。

参数列表可参考:
http://ant.apache.org/manual/Tasks/javac.html

参数太多,无法逐一实验,于是继续搜索javac与spring mvc的关系,直至看到此网页
http://stackoverflow.com/questions/2622018/compile-classfile-issue-in-spring-3

回答如下:
Argument names are stored in the compiled code only when it's compiled in debug mode, so you should either compile it in debug mode or supply@RequestParamwith explicit parameter names. The latter approach is more reliable because it doesn't depend on the environment:

于是找到ant脚本中javac选项 更改配置:

debug="true" debuglevel="lines,vars,source"
重新编译打包,解决!

结论:在使用Spring MVC的时候,如果要使用方法参数自动映射等功能,而又采用ant打包的时候,务必将javac -g的调试选项全部打开。也许因为使用ant的越来越少了吧,网上关于此问题的描述极少。


因此记录,避免后面的同学入坑
URL在MVC中的核心作用:从路由匹配到语义驱动 URL不仅是HTTP请求的地址标识,更是现代Web框架中实现资源定位、操作分发与语义表达的基础载体。其本质是请求路径与控制器方法之间的映射契约,依赖路由匹配算法(如AntPathMatcher、Trie树)、参数绑定机制及HTTP方法协同完成调度。理解URL解析原理,有助于规避404路由冲突、参数注入失败、版本化混乱等高频问题;掌握正则匹配性能陷阱、RESTful语义对齐、反向路由生成等关键技术,可显著提升API设计合理性与系统可维护性。本文聚焦Spring MVC等主流框架中URL的全生命周期管理,覆盖标 阅读详情

相关推荐

Spring框架中反射机制的核心作用与应用

反射(Reflection)是Java语言的核心特性,它允许程序在运行时动态获取类信息和操作对象。在Spring框架中,反射机制是实现控制反转(IoC)和面向切面编程(AOP)两大核心特性的关键技术。通过反射,Spring能够在运行时动态创建Bean实例、实现依赖注入、处理注解配置,以及支持动态代理等高级功能。这种设计显著降低了组件间的耦合度,提高了系统的灵活性和可扩展性。在企业级应用开发中,反射机制使得Spring能够支持复杂的配置管理、事务控制、安全验证等场景,同时通过缓存反射元数据等优化手段保证系统性

weixin_34110749的博客 361

使用Ant编译SpringFramework-1.0

下载SpringFramework源码 SpringFramework-3.x以前的版本都在托管在sourceforge.net网站,3.x以后才开源在Github,而笔者想要SpringFramework-1.0,所以先去sourceforge.net网站(https://sourceforge.net/projects/springframework/files/springframework...

Cmainlove的专栏 630

Spring Boot @GetMapping注解深度解析:从基础语法到高级实战避坑指南

在Web开发领域,请求映射是构建RESTful API的核心基础,它定义了客户端请求与服务器端处理逻辑之间的桥梁。其原理是通过注解将HTTP请求的路径、方法、参数等元信息与特定的控制器方法进行绑定,实现请求的路由与分发。掌握请求映射技术对于构建清晰、高效、可维护的后端服务至关重要,它能显著提升接口的健壮性和开发效率。在实际的工程实践中,开发者常需处理路径变量、参数绑定、内容协商等复杂场景,并规避路径匹配冲突、版本升级适配等常见陷阱。本文聚焦Spring Boot框架中的@GetMapping注解,深入剖析其

weixin_33842304的博客 434

jenkins 配置 springmvc 项目(非maven) 使用ant 打包

jenkins 配置: 参考: https://www.cnblogs.com/Zfc-Cjk/p/9043076.html 参考: https://www.cnblogs.com/lidong94/p/7427923.html 参考: https://blog.youkuaiyun.com/Qizonghui/article/details/80657206 参考:https://blog.c...

kzcming的博客 1160

从事件驱动转向数据驱动,记录一次旧系统改造UI过程

笔者亲身经历,参与公司对外服务项目旧系统UI改造[并非完全重构],整个改造过程的点滴记录在这里…目前是临时版,项目还在启动阶段,随笔记录…

qq_17084703的博客 910

XWork 2.1.1源码工程包:含完整依赖、Ant/Maven构建支持与测试用例

XWork 2.1.1是Struts2框架的核心基础组件,这个资源包提供其全部Java源代码,结构清晰:src目录下为标准Java包组织的主逻辑,test目录包含JUnit 3.8.2和TestNG 5.1编写的单元测试,etc提供典型配置示例,java目录遵循规范分层。配套build.xml支持Ant一键编译与打包,pom.xml兼容Maven导入,开箱即用。依赖库已全部内置,包括Spring 2.0.7全系模块(core、beans、context、aop、web)、OGNL 2.6.11表达式引擎、A

pp12345的博客 243

ant编译打包SSH项目

使用myeclipse8.5 IDE      工程使用SSH框架      容器使用tomcat      使用ant完成工程编译打包发布  -->                                                                                           --

pingguonjb的专栏 1027

17_ant_完整的用户管理小项目_搭建了spring_mvc的框架

17_ant_完整的用户管理小项目_搭建了spring_mvc的框架17_ant_完整的用户管理小项目_搭建了spring_mvc的框架

SpringMVC支持ant风格的路径以及SpringMVC支持路径中的占位符(重点)

7、SpringMVC支持ant风格的路径 ?:表示任意的单个字符 <a th:href="@{/a1a//testAnt}">测试Ant风格的路径:?:表示任意的单个字符</a><br/> @RequestMapping("/a?a/testAnt")//?:表示任意的单个字符 public String testAnt() { return "target"; } *:表示任意的0个或多个字符 <a th:h

qq_37138380的博客 631

详解Spring mvc ant path的使用方法

主要介绍了详解Spring mvc ant path的使用方法的相关资料,希望大家通过本文能掌握这部分内容,需要的朋友可以参考下

SAP SD RRB实战:从DIP参数文件到DP90/DP91开票的完整链路解析

本文详细解析了SAP SD模块中RRB(Resource-related Billing)业务场景的完整链路,从DIP参数文件配置到DP90/DP91开票操作。通过实战案例分享DIP参数文件的核心配置技巧、特性设置及物料决定要点,帮助用户掌握动态开票的关键技术,提升SAP SD RRB的实施效率。

weixin_26833939的博客 378

Spring MVC之获取请求参数

SpringMVC获取请求参数 1、通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 @RequestMapping("/testParam") public String testParam(HttpServletRequest request){ String username = request.getParameter("username"); String

weixin_45608136的博客 607

n8n实战:动态报表生成与企业微信自动化推送

本文详细介绍了如何利用n8n实现动态报表生成与企业微信自动化推送的全流程。通过配置n8n Form触发器、智能报表生成核心逻辑以及企业微信Webhook推送,帮助企业大幅提升数据收集与报表推送效率,实现从数据录入到报表推送的全自动化处理。

weixin_29267307的博客 305

ant编译java 和eclipse编译的差别

web工程在windows环境eclipse下编译部署没有问题,系统升级时需要svn取源码并用ant编译部署到线上机器,部署启动正常没有错误,当访问业务的action时报错,如下。         java.lang.IllegalArgumentException: Name for argument type [java.lang.String]   not availabl

lao_pei的专栏 4474

关于AD中如何绘制原理图及其封装

AD中如何绘制原理图及其封装 题记:这是一个比较基础的知识,之所以我打算写一篇这样的笔记,主要是因为在日常生活中,我极少绘制特殊模块或芯片原理图及其封装。久而久之就忘记咋画了,有时需要画封装的时候又想不起来,网上的资料虽然一堆堆的,但往往只是仅原理图的绘制,或者是仅封装的绘制。为此我写一篇这样的笔记,记录绘制原理图及其封装的一条龙服务,感觉这对我而言尤为重要。 本文分为三大板块,依次是原理图的绘制、封装的绘制、二者的联立 第一板块——原理图的绘制 原理图的建立 第二板块——封装的绘制 第三板块——二者的

weixin_51130221的博客 7万+

从电商平台到微信私域:构建合规跳转链路的技术实现

在互联网营销与用户增长领域,链接跳转是连接不同平台、引导用户流量的基础技术。其核心原理是通过服务器端路由与参数解析,实现用户请求的接收、处理与重定向。这项技术的价值在于能够突破平台间的生态壁垒,实现流量的合规、可控迁移,尤其适用于跨平台营销、私域沉淀等场景。在实际应用中,常需处理微信环境限制、参数传递与动态内容生成等挑战。本文聚焦于电商平台(如淘宝)到微信生态的跳转需求,详细阐述了如何利用Node.js、Express框架及二维码生成技术,构建一个包含环境检测、参数传递与动态落地页的完整跳转系统,以解决微信

weixin_33889665的博客 324

什么是 ANT 表达式,以及如何在java中使用

ANT 表达式(也称为或)是一种用于匹配文件路径或目录结构的简单模式匹配语法。它最初由 Apache Ant 构建工具引入,广泛应用于各种构建工具、配置文件、文件系统操作等场景中,用于指定文件或目录的匹配规则。ANT 表达式的语法非常直观,允许使用通配符来匹配文件名、目录名或路径中的某些部分。它类似于 Unix Shell 的路径匹配规则,但有一些特定的扩展和差异。

DavidSoCool的博客 1349

从零开始创建Davinci Configurator配置工程

本文介绍了从零开始搭建达芬奇工程的详细步骤。首先安装Vector的CBD包后,通过DavicCFG.exe新建空白ECU工程。文章提到Postbuild相关概念可参考往期文章《AUTOSAR配置中的PostBuild、Precompile、Linktime》,并预告下期将讲解如何通过导入DBC文件来启用AUTOSAR模块。全文以实操截图为主,步骤清晰简明,适合开发者参考备份。

Xiaowestwind的博客 219

Spring MVC路由机制详解与最佳实践

在Java Web开发中,路由机制是实现请求分发的核心技术,它决定了HTTP请求如何映射到对应的处理逻辑。Spring MVC作为主流框架,通过注解驱动的方式提供了灵活的路由配置能力,支持RESTful风格URL设计和参数绑定。理解@RequestMapping注解及其衍生注解(如@GetMapping)的使用方法,掌握路径变量和正则表达式的应用,是构建高效API的基础。本文结合电商系统等实际场景,深入解析路由冲突解决、性能优化方案,并分享404问题排查等实战经验,帮助开发者提升Spring MVC路由配置

weixin_33824363的博客 454

第229篇 轨迹时间参数化——TOPP-RA和速度约束处理

本文介绍了时间最优路径参数化(TOPP)问题及其解法。TOPP研究如何在给定空间路径上分配时间,使机器人运动时间最短且不超速,需满足速度、加速度和力矩约束。经典解法采用相平面法,通过前向和后向扫描确定最优速度曲线。TOPP-RA改进了数值稳定性,支持多约束处理。文章对比了TOPP与轨迹优化的区别,列举了开源工具,并解答了面试常见问题,指出TOPP广泛应用于机械臂、AGV等领域。TOPP不改变路径形状,仅优化速度分配,其最优解具有bang-bang特性。

郑伟强dev的专栏 323

Ultralytics YOLOv8 英伟达™ Jetson®处理器部署

英伟达™(NVIDIA®)Jetson 是一系列嵌入式计算板卡,旨在为边缘设备带来加速的 AI(人工智能)计算。这些小巧而功能强大的设备围绕英伟达™(NVIDIA®)的GPU架构打造,能够直接在设备上运行复杂的人工智能算法和深度学习模型,而无需依赖云计算资源。Jetson 板卡通常用于机器人、自动驾驶汽车、工业自动化和其他需要在本地以低延迟和高效率执行人工智能推理的应用中。此外,这些板卡基于 ARM64 架构,与传统 GPU 计算设备相比运行功耗更低。英伟达™(NVIDIA®)JetPack SDK。

机器人控制与仿真应用 3876

Spring MVC功能配置示例

Spring MVC的配置应用示例

onePlus5T的博客 543

AI测试干货:Claude Code Skill 从入门到精通

本文介绍了Claude Code Skill功能如何解决AI重复工作问题。传统提示词方式需要人工复制粘贴,而Skill功能通过建立AI工作记忆库实现智能触发和分层加载。Skill包含工作指令、文档和资源,能自动执行任务。文章以API测试用例生成为例,展示了Skill的创建流程和结构化设计,包括测试框架、覆盖场景和输出格式,显著提升测试工程师的工作效率。

blues_C的博客 2442

Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

目录 一、控制器定义 1.1、实现接口Controller定义控制器1.2、使用注解@Controller定义控制器  二、@RequestMapping详解 2.1、value 属性指定映射路径或URL模板 2.1.1、指定具体路径字符2.1.2、路径变量占位,URI模板模式2.1.3、正则表达式模式的URI模板2.1.4、矩阵变量@MatrixVariable2.1.

xjanting的博客 479

深度学习工具包 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")

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

部署项目到linux中报Spring MVC报异常:org.springframework.web.util.NestedServletException: Request processing fa...

@RequestMapping(value = "/security/login", method = RequestMethod.POST) public ModelAndView login(@RequestParam String userName, @RequestParam String password, HttpServletRequest request) ...

a529950803的博客 542

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spring Boot中404错误的深度解析与解决方案

HTTP 404状态码表示服务器无法找到请求的资源,在Spring Boot框架中,这种错误可能由多种机制触发。DispatcherServlet作为统一入口,会通过HandlerMapping寻找匹配的处理器,若未找到则抛出NoHandlerFoundException。Spring Boot 2.3.x后需显式配置才能捕获该异常。常见404诱因包括URL路径不匹配、静态资源位置错误及版本升级导致的路径处理变化。通过全局异常处理、精细化日志监控及前端路由协调,可以有效解决这些问题。在微服务架构中,404问

weixin_34355559的博客 482

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 神兵利器Gradle
下一篇: 消息中间件认知及RocketMQ
frog4
博客等级 码龄18年 56粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值