关于maven的几个常用插件

最近整理了自己写的一个项目,使用maven+svn管理,idea开发,搭建了一个maven的私服.原来是凌乱不堪,所以费了好大劲才整理好,而且平时公司项目上事情多的一米…

下面说说使用的几个插件(至于那些dependency就让它们见鬼去吧)

不说废话了,代码贴上

  1. clean插件

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-clean-plugin</artifactId>
         <version>2.5</version>
         <configuration>
             <filesets>
                 <fileset>
                     <directory>F:/logs</directory>
                 </fileset>
                 <fileset>
                     <directory>../message-test</directory>
                     <includes>
                         <include>spy.log</include>
                     </includes>
                 </fileset>
                 <fileset>
                     <directory>../message-test/target</directory>
                 </fileset>
             </filesets>
         </configuration>
     </plugin>
    

    这个插件没啥好说的,要是不需要删除别的地方代码,就用默认的,不用任何配置

  2. 单元测试插件

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.16</version>
         <configuration>
             <skip>true</skip>
         </configuration>
     </plugin>
    

    单元测试没做好,一测就报错,干脆给skip了

  3. resources

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
         <version>2.6</version>
         <executions>
             <execution>
                 <id>copy-resources</id>
                 <!-- here the phase you need -->
                 <phase>validate</phase>
                 <goals>
                     <goal>copy-resources</goal>
                 </goals>
                 <configuration>
                     <outputDirectory>${basedir}/target/test-classes</outputDirectory>
                     <resources>
                         <resource>
                             <directory>${basedir}/src/main/webapp/WEB-INF/config</directory>
                             <filtering>true</filtering>
                         </resource>
                     </resources>
                 </configuration>
             </execution>
         </executions>
     </plugin>
    

    用来复制一些资源文件,配置都是直译的

  4. war

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-war-plugin</artifactId>
         <version>2.4</version>
         <configuration>
             <warName>${message.war.name}</warName>
             <includeEmptyDirectories>true</includeEmptyDirectories>
             <webResources>
                 <resource>
                     <directory>../message-easyjs</directory>
                     <targetPath>js</targetPath>
                     <excludes>
                         <exclude>**/.svn</exclude>
                         <exclude>**/*.iml</exclude>
                         <exclude>**/pom.xml</exclude>
                     </excludes>
                 </resource>
             </webResources>
         </configuration>
     </plugin>
    

    打war包的插件

  5. jetty

     <plugin>
         <groupId>org.mortbay.jetty</groupId>
         <artifactId>maven-jetty-plugin</artifactId>
         <version>6.1.10</version>
         <configuration>
             <!-- 配置扫描时间 -->
             <scanIntervalSeconds>10</scanIntervalSeconds>
             <!-- 配置项目在容器中的根路径 -->
             <contextPath>${project.contextPath}</contextPath>
             <!-- 配置jetty容器中的jndi -->
             <jettyEnvXml>src/main/resources/jetty.xml</jettyEnvXml>
             <connectors>
                 <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                     <!-- 端口 -->
                     <port>${project.port}</port>
                     <maxIdleTime>60000</maxIdleTime>
                 </connector>
             </connectors>
             <!-- 按照官网上说的是配置停止容器的快捷键和端口,至今不知怎么在idea中如何使用,有知道的麻烦告知下,3Q -->
             <stopKey>foo</stopKey>
             <stopPort>8888</stopPort>
         </configuration>
         <executions>
             <!-- 配置在maven哪个生命周期执行插件的哪个动作 -->
             <execution>
                 <id>jetty_run</id>
                 <!-- maven生命周期 -->
                 <phase>compile</phase>
                 <!-- 执行插件的哪个动作 -->
                 <goals><goal>run</goal></goals>
             </execution>
         </executions>
         <dependencies>
             <!-- 这个插件依赖的几个包 -->
             <dependency>
                 <groupId>org.eclipse.jetty</groupId>
                 <artifactId>jetty-io</artifactId>
                 <version>7.6.6.v20120903</version>
             </dependency>
             <dependency>
                 <groupId>org.eclipse.jetty</groupId>
                 <artifactId>jetty-server</artifactId>
                 <version>7.6.6.v20120903</version>
             </dependency>
         </dependencies>
     </plugin>
    

    jetty这个插件当时可是整的我头疼,各种报错各种上网找资料,附上jetty的配置文件:jetty.xml

     <?xml version="1.0"?>
     <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
     <Configure class="org.mortbay.jetty.webapp.WebAppContext">
         <New id="mysql" class="org.mortbay.jetty.plus.naming.Resource">
             <Arg>jdbc/core</Arg>
             <Arg>
                 <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
                     <Set name="Url">jdbc:mysql://localhost:3306/message</Set>
                     <Set name="User">root</Set>
                     <Set name="Password">123456</Set>
                 </New>
             </Arg>
         </New>
     </Configure>
    
  6. cargo(可以启动tomcat,远程部署,本地部署,都支持的,这里我只用到本地部署,远程部署需要配置tomcat-user.xml和tomcat的控制台)

     <plugin>
         <groupId>org.codehaus.cargo</groupId>
         <artifactId>cargo-maven2-plugin</artifactId>
         <version>1.4.3</version>
         <configuration>
             <container>
                 <!-- tomcat的版本,tomcat6使用tomcat6x -->
                 <containerId>${cargo.tomcat.version}</containerId>
                 <!-- tomcat在本地的绝对路径 -->
                 <home>${tomcat.home}</home>
                 <!-- 本地安装就用installed,远程使用remote -->
                 <type>installed</type>
      
                 <!-- tomcat日志文件路径 -->
                 <output>${tomcat.home}/logs/container.log</output>
                 <append>false</append>
                 <log>${tomcat.home}/logs/cargo.log</log>
             </container>
             <configuration>
                 <!-- 本地部署,已存在 -->
                 <type>existing</type>
                 <!-- 再配置一次tomcat绝对路径 -->
                 <home>${tomcat.home}</home>
                 <properties>
                     <!-- 端口 -->
                     <cargo.servlet.port>${project.port}</cargo.servlet.port>
                 </properties>
             </configuration>
             <!-- 这里一次可以部署多个项目 -->
             <deployables>
                 <!-- 指定我部署的项目GAV -->
                 <deployable>
                     <groupId>com.message</groupId>
                     <artifactId>message-test</artifactId>
                     <!-- war包形式部署 -->
                     <type>war</type>
                     <properties>
                         <!-- 容器中的上下文根 -->
                         <context>${project.contextPath}</context>
                     </properties>
                 </deployable>
             </deployables>
         </configuration>
         <!-- 同jetty -->
         <executions>
             <execution>
                 <id>tomcat-run</id>
                 <phase>package</phase>
                 <goals><goal>run</goal></goals>
             </execution>
         </executions>
     </plugin>
    
    • tomcat使用cargo这个插件有个缺点,不能debug了,而且不是热部署,不知道cargo有没有热部署的功能,暂时我还没找到,待研究
    • jetty那个是可以热部署的,不管改Java类还是jsp或者css,js都可以(加减方法,改参数不行)
  7. 附上maven的properties

     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <junit.version>4.10</junit.version>
         <spring.version>3.0.5.RELEASE</spring.version>
         <jdk.version>jdk15</jdk.version>
         <tomcat.version>6.0.32</tomcat.version>
         <message.war.name>message</message.war.name>
         <project.port>8099</project.port>
         <project.contextPath>/core</project.contextPath>
         <tomcat.home>F:\study\apache-tomcat-6.0.32</tomcat.home>
         <cargo.tomcat.version>tomcat6x</cargo.tomcat.version>
     </properties>
    

关于p6spy的介绍

最近公司项目里需要使用到将所有执行的sql打出日志,放在一个文件下。公司一大神级人物给解决了,刚刚花了点时间给研究了一下。

他用的就是p6spy,其实也没做多少工作。主要的工作p6spy都已经做过了。

p6spy我的理解就是:p6spy将应用的数据源给劫持了,应用操作数据库其实在调用p6spy的数据源,p6spy劫持到需要执行的sql或者hql之类的语句之后,他自己去调用一个realDatasource,再去操作数据库,只要劫持到那些sql之后,能干的事情就很多了。

p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Profiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。

p6spy在sourceforge上下载:[p6spy][]
[p6spy]: http://sourceforge.net/projects/p6spy/?source=dlp

p6spy的配置:

  1. p6spy.jar放入应用的classpath下

  2. 修改连接池或者连接配置的jdbc的驱动为p6spy所提供的驱动,com.p6spy.engine.spy.P6SpyDriver

    在单独的Hibernate的应用中,数据库驱动配置在hibernate.cfg.xml里面,所以我需要配置文件中的connection.driver_class属性从oracle.jdbc.driver.OracleDriver改为com.p6spy.engine.spy.P6SpyDriver其他的用户名密码等等配置信息全部不用修改.在web程序中,配置的连接池部分,也只需要修改jdbc-driver的配置即可。

    Hibernate.cfg.xml:

     <session-factory>
         <!-- 在这里改成p6spy提供的数据源 -->
         <property name="connection.driver_class">com.p6spy.engine.spy.P6SpyDriver</property>       
         <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
         <property name="connection.username">scott</property>
         <property name="connection.password">tiger</property>
         <property name="connection.pool_size">1</property>
         <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
         <property name="current_session_context_class">thread</property>
         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
         <property name="show_sql">true</property>
         <property name="hbm2ddl.auto">false</property>
         <property name="hibernate.jdbc.batch_size">0</property>
     </session-factory>
    
  3. 修改 spy.properties 并将其放到classpath下:

     #################################################################
     # MODULES                                                       #
     #                                                               #
     # Modules provide the P6Spy functionality.  If a module, such   #
     # as module_log is commented out, that functionality will not   #
     # be available.  If it is not commented out (if it is active),  #
     # the functionality will be active.                             #
     #                                                               #
     # Values set in Modules cannot be reloaded using the            #
     # reloadproperties variable.  Once they are loaded, they remain #
     # in memory until the application is restarted.                 #
     #                                                               #
     #################################################################
     #第一:module.log的属性必须配置,如果不配置,P6SPY将不起任何作用,典型配置:
     module.log=com.p6spy.engine.logging.P6LogFactory
     #module.outage=com.p6spy.engine.outage.P6OutageFactory
      
     #################################################################
     # REALDRIVER(s)                                                 #
     #                                                               #
     # In your application server configuration file you replace the #
     # "real driver" name with com.p6spy.engine.P6SpyDriver. This is #
     # where you put the name of your real driver P6Spy can find and #
     # register your real driver to do the database work.            #
     #                                                               #
     # If your application uses several drivers specify them in      #
     # realdriver2, realdriver3.  See the documentation for more     #
     # details.                                                      #
     #                                                               #
     # Values set in REALDRIVER(s) cannot be reloaded using the      #
     # reloadproperties variable.  Once they are loaded, they remain #
     # in memory until the application is restarted.                 #
     #                                                               #
     #################################################################
      
     #第二:数据库驱动配置,你懂的,不多说了
     # oracle driver
     # realdriver=oracle.jdbc.driver.OracleDriver
      
     # mysql Connector/J driver
     # realdriver=com.mysql.jdbc.Driver
      
     # informix driver
     # realdriver=com.informix.jdbc.IfxDriver
      
     # ibm db2 driver
     # realdriver=COM.ibm.db2.jdbc.net.DB2Driver
      
     # the mysql open source driver
     realdriver=org.gjt.mm.mysql.Driver
      
     #specifies another driver to use
     realdriver2=
     #specifies a third driver to use
     realdriver3=
      
     #第三:appender配置,一般分为三种
     #specifies the appender to use for logging
     #appender=com.p6spy.engine.logging.appender.Log4jLogger
     #控制台
     #appender=com.p6spy.engine.logging.appender.StdoutLogger
     appender=com.p6spy.engine.logging.appender.FileLogger
      
     # name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) (used for file logger only)
     #日志文件存放路径及文件名
     logfile     = spy.log
      
     # append to  the p6spy log file.  if this is set to false the
     # log file is truncated every time.  (file logger only)
     append=true
      
     #The following are for log4j logging only
     log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
     log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
     log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n
      
     log4j.logger.p6spy=INFO,STDOUT
    

使用history.back(-1)的问题

今天在调一个项目现场的问题,觉得有点记录下来的意义。

首先看看重现问题的步骤:

  1. 选择一个事物分类进行查询,搜到一条记录,然后进入申请页面。

  2. 进入申请页面之后点返回,页面立即没有了(只在IE下会出现问题)而且页面上显示的是webpage has expired!页面已经过期。

    ps:返回按钮触发的事件是:window.history.back(-1);

  3. 解决办法:

    页面过期,我在想了是不是页面上的meta设置no-cache了,即:

     <meta http-equiv="Pragma" content="no-cache"/>
    

    然后我立即查看页面源代码,发现木有这个东西。我就纳闷了,那是怎么了呢。

    后来一想是不是我查询的时候提交了一个表单,这时候已经跳到我查询的目标页面(虽然还是同一个jsp页面),这时候用history.back(-1)已经找不到参数了,所以会报页面找不到的问题。

    然后想到form表单里面的method=”post”和method=”get”的区别(具体的网上搜索去吧)。

    so, 我把搜索的form中method改成get。

然后就OK了,问题解决了。

个人简历

联系方式

个人信息

  • 性别 / 生日:男 / 1990-03-18
  • 工作年限:15 年+
  • 学历:本科,安徽理工大学,信息与计算科学
  • 求职意向:Java 架构师 / 技术负责人 / 资深 Java 开发工程师
  • 荣誉奖励:2011 年实习期间获得“优秀实习生”

职业摘要

15 年+ Java 后端与平台化建设经验,长期负责企业级数字化平台、API 网关、任务调度、DevOps、微服务治理与 AI Agent / RAG 应用平台等方向。曾在 OPPO 数字化转型「凤凰计划」中主导 A+ / A 类核心平台项目,支撑 1400+ 系统接入、近万接口治理、单日 2 亿+ 调用,具备从架构设计、核心研发、团队管理到生产稳定性保障的完整经验。

熟悉 Java / Spring Cloud / APISIX / Docker / Kubernetes / Jenkins / PostgreSQL / Redis 等技术栈,擅长将复杂业务抽象为平台化能力,推动工程规范、CI/CD、自动化部署和研发效能提升。近期重点投入企业级 AI Agent 应用平台建设,围绕 RAG 检索、工具调用、Function Calling、MCP 服务接入、Workflow 编排、ChatBI、智能客服和 AI 编程工具链落地,推动大模型能力在企业知识问答、数据分析和业务流程自动化场景中的工程化应用。

核心能力

  • 架构设计:微服务架构、平台化能力建设、系统拆分与演进、跨系统集成、技术方案评审。
  • 高并发与稳定性:API 网关治理、限流熔断、蓝绿发布、容灾切换、性能优化与故障排查。
  • 工程效能:分支模型、Code Review、CI/CD、自动化部署、发布回滚、研发流程规范化。
  • 团队管理:研发团队带领、项目拆解、跨团队协同、技术氛围建设与人才培养。
  • AI 应用:RAG 知识库、文档结构化解析、工具调用、Function Calling、MCP 服务接入、Workflow 编排、RAG 效果评测、AI 编程工具推广。

工作经历

南京魔数团信息科技有限公司(Teamhelper)

架构师 / 技术负责人 · 2025-06 ~ 至今

  • 负责研发团队技术规划与架构设计,主导关键技术方案制定、POC 验证、落地执行及结果验收。
  • 梳理存量产品与服务架构,沉淀业务架构、技术架构、部署架构与组件关系图,制定阶段性架构演进路线。
  • 配合售前与销售完成项目工时评估、技术可行性评估和关键技术验证,提升方案交付确定性。
  • 负责 6 人服务端团队管理,支撑项目部与平台部日常研发,保障项目按期交付。

重点成果

  • 统一云存储对接:设计多厂商云存储适配方案,统一鉴权策略、生命周期管理和接入规范,提升系统兼容性与运维效率。
  • 远程会议实时翻译:设计会议实时翻译链路,优化音频处理、翻译调用与结果回传流程,提升会议场景用户体验。
  • 工程规范与 DevOps:制定分支模型、代码规范和 Code Review 标准,搭建 CI/CD 流水线,完善发布与回滚机制,降低发布风险。
  • 自动化部署工具:针对客户生产环境网络隔离问题,设计脚本化自动部署工具;通过 Jenkins 一键构建客户定制化服务、数据库脚本与配置文件,使用 Python 初始化部署文件,并通过 Shell 完成环境检测、Docker 安装、微服务部署和数据初始化,显著降低交付人员部署成本。
  • 智能体应用平台:参考 FastGPT 设计思路,建设支持 RAG 检索、工具调用、MCP 接入与 Workflow 编排的智能体应用平台;基于 Java 与 LangChain4j 完成核心能力从 0 到 1 设计与实现,支撑企业内部 / ToB 知识问答、文档理解和业务流程自动化场景。
    • RAG 知识库:实现文本 / 图片数据集管理,支持文档上传、解析、分块、向量化、索引构建与检索召回;将向量数据写入 PostgreSQL,并结合语义检索、全文检索和混合检索提升召回率与准确率。
    • 文档结构化解析:封装 native、VLM、MinerU、DeepDoc 等多种解析能力,并以独立 Docker 服务交付,支持将 PDF、Office、图片等多格式文档转换为结构化 Markdown 内容。
    • 分块与召回策略:支持 QA 问答对、段落、长度、正则表达式等多种分块策略,并根据不同知识场景配置检索参数、召回策略与结果重排逻辑。
    • 工具调用与 MCP 接入:抽象平台工具接入模型,支持将第三方 MCP 服务、标准 API、业务系统接口和内部服务能力封装为智能体可调用工具,覆盖工具注册、参数定义、鉴权配置、调用执行、结果回填和异常处理等链路。
    • Workflow 流程编排:设计可配置的节点化编排机制,支持 RAG 检索、模型调用、条件判断、工具执行、结果格式化与异常兜底等节点组合,提升复杂任务处理能力。
    • RAG 效果评测:了解并使用飞书罗盘、RAGAS 等评测工具,对不同分块策略、检索参数、召回 TopK、重排策略和模型配置下的命中率、召回率进行对比测试,为知识库效果优化提供数据依据。
    • 工程化交付:完成核心服务拆分、Docker 镜像封装、部署脚本与环境初始化能力建设,便于在客户环境中快速部署和交付。
    • 团队赋能:在公司内部分享 RAG、文档解析、智能体应用平台建设经验,推动团队理解 AI 应用从知识问答到流程自动化的落地路径。
  • AI 编程落地:在公司内部推广 codex-cli、claude-cli、opencode、gemini-cli 等 AI 编程工具,推动重复性研发工作自动化,让团队成员聚焦架构设计、复杂问题分析与业务创新。

南京蔚蓝智能科技有限公司

架构师(技术负责人)· 2024-04 ~ 2025-06

  • 担任数字化团队技术负责人,管理 10+ 外协研发人员,负责团队技术架构、研发流程和技术氛围建设。
  • 负责公司数字化系统架构设计与技术方案评审,推动业务系统稳定交付。
  • 主导出海项目隐私合规相关工作,覆盖隐私数据合规、跨境传输与相关协议梳理。
  • 作为项目负责人和技术接口人,对接建行生活、建行善融等外部合作方,推进需求沟通、接口联调与交付验收。
  • AI Agent 与智能化应用探索:
    • 基于 Dify 平台与飞书生态,构建公司内部 ChatBI 原型应用,将业务数据查询、自然语言问答、Workflow 编排与企业 IM 场景结合,验证大模型在经营分析和内部数据服务中的落地可行性。
    • 在 ChatBI / 智能问答 POC 中使用并封装 Function Calling 能力,完成工具描述、参数 Schema 定义、模型返回解析、函数路由执行和结果回填,验证自然语言到业务数据查询的技术路径。
    • 协助客服部门完成智能客服系统选型,从 RAG 知识库建设、大模型对话效果、Agent 流程编排、工具调用、Function Calling、会话上下文管理、调优成本和系统集成难度等维度进行评估,为后续智能客服建设提供技术判断依据。

南京叶子科技有限公司(OPPO 全资子公司)

架构师 · 2018-08 ~ 2024-04

  • 负责 OPPO 销售领域数字化平台建设,带领团队完成 PaaS 层能力建设,包括控制台、流程中心、网关中心、任务调度中心、集成中心等。
  • 参与 OPPO 数字化转型「凤凰计划」,主导 1 个 A+ 类项目(API 集市)和 2 个 A 类项目(魔盒开发者平台、任务调度中心)。
  • 协同运维搭建 DevOps 流程,沉淀底层工具类组件并在公司内部复用。
  • 参与技术选型、标准制定、技术方案评审和疑难问题攻关。
  • 参与大数据相关能力的引入与初步落地。

代表项目:API 集市(A+ 类)

  • 角色:系统架构师
  • 背景:整合 OPPO 内部上千套系统,通过 API 集市统一管理 API 调用关系、质量、权限与治理能力。
  • 成果:接入 1400+ 系统、近万接口;完成中国、巴黎、新加坡、印度多地部署;中国区支持异地双机房部署、分钟级容灾切换与蓝绿发布;全年可用性 99.99%,无重大事故;单日流量峰值 2 亿+,TPS 峰值 5000+;主导系统降本计划,年度节省成本 80 万+。
  • 技术栈:Java、Spring、Lua、APISIX、Docker、Kubernetes。

代表项目:任务调度中心(A 类)

  • 角色:产品 / 架构师 / 主程
  • 背景:基于 Quartz 自研统一任务调度平台,集中管控公司内部系统定时任务。
  • 成果:覆盖 800+ 系统、6000+ 任务,累计调度 3.5 亿+ 次;支持 HTTP 任务、自研协议任务、Dubbo 任务;支持任务分片、广播和多 Quartz 集群隔离,降低任务间互相影响。

代表项目:魔盒开发者平台(A 类)

  • 角色:架构师 / 主程 / 项目经理
  • 背景:作为 OPPO 凤凰计划核心平台之一,支撑内部上千系统集成,提供网关、消息、ETL 等通用技术能力。
  • 成果:管理 20 人研发团队完成平台交付;协助产品经理完成需求分析与评审,输出概要设计并推动需求拆解、详细设计和研发落地;支持开发团队解决复杂技术问题,保障平台能力按期交付。

离职原因:公司组织调整,Base 变更为深圳。

中兴软创科技股份有限公司(浩鲸云)

架构师 · 2015-04 ~ 2018-08

  • 负责政企事业部智慧城市方向底层架构开发与平台化能力建设。
  • 负责核心模块设计与实现,保障系统可扩展性与稳定性。
  • 参与项目技术方案制定、公共能力沉淀和疑难问题处理。

离职原因:寻求更好的职业发展机会。

联创车盟汽车服务有限公司(AA China)

高级 Java 开发工程师 · 2014-07 ~ 2015-04

  • 参与慧驾平台结算系统设计与开发,承担核心功能研发和产品技术支撑。
  • 与团队协作完成系统架构优化、新技术调研与落地。

离职原因:公司欠薪,领导鼓励离职。

江苏金智教育信息技术有限公司

高级 Java 开发工程师 · 2011-07 ~ 2014-07(含 1 年实习)

  • 参与统一通信平台与工作流相关项目研发,服务全国本专科学校。
  • 协助实现自定义表单、内容管理系统(CMS)内容模型等模块。
  • 2011.07 ~ 2012.07 实习期间获得“优秀实习生”。

离职原因:寻求新的发展机会。

开源项目

Java 基础框架与工程工具

  • lodsve-boot:基于 Spring Boot 和常用开源组件沉淀的开发基础套件。
  • lodsve-framework:面向 Spring 应用开发的基础框架,封装通用开发能力。
  • lodsve-maven-archetype:用于快速创建 lodsve-framework 项目的 Maven Archetype。
  • lodsve-maven-plugins:面向项目构建与工程效率的 Maven 插件集合。

AI / Vibe Coding 实践项目

  • docker-manager-ui:Docker 运行时管理平台,提供直观的 Web 管理界面,用于查看和管理容器、镜像、网络、存储卷等 Docker 资源,体现对容器化运维场景和前端工具化产品的实践。
  • kimi-code-switch-gui:面向 kimi-code-cli 配置管理的可视化工具,通过 GUI 简化配置切换与使用流程,体现对 AI 编程工具链、开发者体验和效率工具建设的持续探索。

技能栈

  • 后端与微服务:Java、Spring、Spring Boot、Spring Cloud、Dubbo、RESTful API、服务治理、性能优化。
  • API 网关与平台化:APISIX、Nginx、Lua、鉴权、限流、熔断、灰度发布、蓝绿发布、API 治理。
  • 容器化与 DevOps:Docker、Kubernetes、Jenkins、GitLab CI、Maven、Gradle、自动化部署、发布回滚。
  • 数据库与缓存:MySQL、PostgreSQL、Redis、MongoDB、Memcached、SQL 优化、故障排查。
  • AI Agent 工程:Dify、FastGPT 设计思路、LangChain4j、Function Calling、MCP 服务接入、工具调用、Workflow 编排、智能客服、ChatBI。
  • RAG 与检索评测:文档结构化解析、向量检索、全文检索、混合检索、飞书罗盘、RAGAS、命中率与召回率评测。
  • 中间件与工程能力:RabbitMQ、Quartz、任务调度、可观测性、稳定性建设。
  • 脚本与工具:Python、Shell、JavaScript、Groovy、Node.js、Scala、PHP。
  • 通用能力:团队管理、跨团队沟通、技术方案评审、项目拆解、文档沉淀、问题攻坚。

结束语

感谢您阅读我的简历,期待有机会进一步沟通。