Spring Boot 每次打JAR包都那么大, 烦死了, 还有个小坑顺便解决了

本文介绍如何优化SpringBoot项目的打包过程,通过分离依赖包降低单个JAR文件大小,提高部署效率。文章详细解释了Maven插件配置,以及如何避免依赖冲突,确保应用顺利启动。

一直以来公司网都特别不稳定, 每次发JAR包的时候都要发N次, 崩溃....

其实Spring Boot项目默认的会打包成单一的jar文件, 部署的确方便, 好处也很多,  但资源有限的时候还是打小包吧, 我们可以把依赖包都打到一起。试了好几次, 发现有些坑说一下。首先采用这个pom配置。简单可用

            <!--共享依赖包-->
            <plugin>
                <!--打包时去除第三方依赖-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <groupId>non-exists</groupId>
                            <artifactId>non-exists</artifactId>
                        </include>
                    </includes>

                </configuration>
            </plugin>
            <plugin>
                <!--拷贝第三方依赖文件到指定目录-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

1. 打包成功后就可以这样运行了

java -jar -Dloader.path=lib demo.jar

但是 很不巧的是, 其它项目都很正常,  就有一个项目打完整包没问题, 但是用共享依赖的就抛出莫名的错误, 根本无法启动, 试了几次终于发现是这个问题. 看看两个配置有什么不同.

        <dependency>
            <groupId>com.google.collections</groupId>
            <artifactId>google-collections</artifactId>
            <version>1.0</version>
        </dependency>
==========================================================================
        <dependency>
            <groupId>com.google.collections</groupId>
            <artifactId>google-collections</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>

对了, 就是包冲突的问题,  maven可以管理各种依赖,但也会出现一些包冲突的问题,  加上 <scope>provided</scope> 不打进共享依赖就可以了, ok了

 

<think>嗯,用户要求不使用SpringBoot来设计超市销售系统,这其实是个挺有意思的技术挑战。之前我推荐的是SpringBoot全家桶方案,现在得完全切换到轻量级技术栈。从用户提到的工具来看,核心诉求是:IntelliJIDEA负责Java后端、VSCode处理前端和SQL、数据库直接用SQLQuery操作。用户应该是个熟悉Java生态但想尝试不同技术路线的开发者,可能是在学习轻量级框架或者维护旧系统。技术选型上,后端可以换成SparkJava+JDBI组合,SparkJava做路由比裸写Servlet方便太多,JDBI处理数据库映射又比纯JDBC省力。前端继续用Vue.js没问题,但构建工具得从Vite开始配置,这点在VSCode里需要额外指引。特别要注意的是数据库版本控制,SpringBoot里Flyway是自动集成的,现在得手动在IDEA里配置Flyway的独立任务。还有事务管理这个坑,没有SpringTransactional注解后,得用JDBI的@Transaction或自己写连接管理。用户可能没意识到的是测试复杂度——没有SpringTest支持下,API测试得用独立HTTP客户端,这点要在协作流程里强调。另外安全认证也得重新设计,考虑用JWT+Filter替代SpringSecurity。最关键的还是工具链协作:IDEA里跑Spark应用时,需要和VSCode的liveserver配合调试。这里可以推荐IDEA的HTTPClient功能,比Postman更贴近开发环境。数据库建模部分其实IDEA比VSCode更强,ER图生成和逆向工程应该作为重点推荐功能。扩展性方面要提醒用户,未来加消息队列或缓存时需要手动集成,比如在SparkJava里嵌Redis客户端。不过对于超市系统初期,这些应该都不是问题。</think> 好的,我们可以完全不依赖Spring Boot,使用更轻量级的基础技术和您指定的工具来构建超市销售系统。核心思路是:**基于纯Java EE基础、直接JDBC/SQL操作、手动路由映射,并利用IntelliJ IDEA、VS Code和SQL工具进行高效协作**。 以下是详细方案: --- ### 一、技术栈替代方案 | 组件 | 替代 Spring Boot 的技术 | 说明 | | :------------- | :---------------------------------------------- | :------------------------------------------------------------------- | | **后端框架** | 纯 `Servlet` + `JSP` / **SparkJava** 微框架 | Servlet/JSP 是 Java EE 核心;SparkJava 极简路由框架[^4] | | **依赖管理** | Maven / Gradle (直接在 IDEA 中配置) | IDEA 原生支持,管理 jar | | **数据访问** | **原生 JDBC** / **JDBI** (简化 JDBC) | 避免 Spring Data JPA 依赖 | | **数据库** | MySQL (通过 SQLQuery/IDEA DB 工具管理) | 直接使用 SQL 设计与操作 | | **前端** | Vue.js/React + HTML/CSS (VS Code 开发) | 前后端分离,通过 RESTful API 或 JSP 交互 | | **模板引擎** | JSP (内嵌) / **Apache FreeMarker** (独立) | 可选的视图层渲染 | --- ### 二、工具分工与核心实现步骤 #### **1. 数据库设计 (VS Code + SQLQuery 或 IDEA Database Tool)** * **在 VS Code (安装 SQLTools, MySQL 插件) 或 IDEA Database 控制台中设计表:** ```sql -- 产品表 (DDL 在 SQLQuery 中执行) CREATE TABLE product ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, price DECIMAL(10, 2) NOT NULL CHECK (price >= 0), stock INT NOT NULL CHECK (stock >= 0) DEFAULT 0, category VARCHAR(50) ); -- 销售记录表 CREATE TABLE sale_record ( id INT AUTO_INCREMENT PRIMARY KEY, product_id INT NOT NULL, quantity INT NOT NULL CHECK (quantity > 0), sale_time DATETIME DEFAULT CURRENT_TIMESTAMP, cashier_id INT, -- 关联用户表(需创建) FOREIGN KEY (product_id) REFERENCES product(id) ); -- 用户表(收银员) CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(100) NOT NULL, -- 存储加盐哈希值 role ENUM('CASHIER', 'MANAGER') NOT NULL ); ``` * **在 IDEA 使用 Database 工具:** * 可视化管理表结构,执行 SQL,生成 ER 图。 * 正向/逆向工程:从 SQL 脚本生成表,或从数据库生成实体类雏形。 * **关键优势**:SQL 编写、执行与版本控制一体化,强于 VS Code[^3]。 #### **2. 后端开发 (IntelliJ IDEA - Java 核心)** * **创建 Maven/Gradle 项目 (IDEA 模板)** * 依赖: `javax.servlet-api`, `mysql-connector-java`, `junit` (测试),可选 `jackson-databind` (JSON), `jdbicore`。 * **数据访问层 (使用 JDBI 或纯 JDBC 示例)** ```java // ProductDao.java (使用 JDBI - 简化 JDBC) public class ProductDao { private final Jdbi jdbi; // 初始化传入DataSource public Product getProductById(int id) { return jdbi.withHandle(handle -> handle.createQuery("SELECT * FROM product WHERE id = :id") .bind("id", id) .mapToBean(Product.class) .one() ); } public void updateProductStock(int id, int change) { jdbi.useHandle(handle -> handle.createUpdate("UPDATE product SET stock = stock + :change WHERE id = :id") .bind("change", change) .bind("id", id) .execute() ); } } ``` ```java // SaleService.java (核心业务逻辑 - 使用DAO) public class SaleService { private ProductDao productDao; public void recordSale(int productId, int quantity) throws InsufficientStockException { Product product = productDao.getProductById(productId); if (product.getStock() < quantity) { throw new InsufficientStockException("库存不足"); } productDao.updateProductStock(productId, -quantity); // 插入sale_record表逻辑(SaleRecordDao实现) } } ``` * **Web层 (SparkJava 替代 Spring MVC)** ```java // MainApp.java (SparkJava 入口) import static spark.Spark.*; public class MainApp { public static void main(String[] args) { port(8080); // 设置端口 // 初始化DataSource和DAO... // 创建销售记录 API post("/api/sales", (req, res) -> { SaleRequest saleReq = new Gson().fromJson(req.body(), SaleRequest.class); try { saleService.recordSale(saleReq.getProductId(), saleReq.getQuantity()); res.status(201); // Created return "Sale recorded"; } catch (InsufficientStockException e) { res.status(400); // Bad Request return e.getMessage(); } }); // 获取产品列表 API (GET /api/products) } } ``` #### **3. 前端开发 (Visual Studio Code)** * **创建 Vue.js/React 项目 (使用 Vite CLI)** ```bash npm create vite@latest supermarket-frontend -- --template vue # 或 react cd supermarket-frontend npm install ``` * **调用后端 API (使用 axios/fetch)** ```javascript // SaleComponent.vue (Vue3 示例) const recordSale = async () => { try { const response = await axios.post('http://localhost:8080/api/sales', { productId: selectedProductId.value, quantity: saleQuantity.value }); if (response.status === 201) { alert('销售成功!'); // 刷新列表或状态... } } catch (error) { alert(`错误: ${error.response.data}`); } }; ``` * **VS Code 插件推荐:** * **Volar (Vue) / ES7+ React Snippets (React)** * **ESLint**:代码规范检查 * **Live Server**:HTML 页面实时预览 * **REST Client**:测试后端 API (`*.http` 文件) #### **4. 配置与部署 (IDEA & Shell)** * **Web Server:** * 使用 **嵌入式 Jetty** 或 **Tomcat Maven Plugin** (配置在 `pom.xml` 中) ```xml <plugin> <!-- Tomcat Maven Plugin 配置 --> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> ``` 运行:`mvn tomcat7:run` (在 IDEA Terminal 中) * **数据库连接配置:** * 在代码中手动创建 `DataSource` (如使用 `HikariCP`) 或通过 `ServletContext` 参数读取属性文件。 --- ### 三、高效协作与优化技巧 1. **API 调试**: * **VS Code**: 使用 `REST Client` 插件编写 `.http` 文件测试接口[^1] ```http POST http://localhost:8080/api/sales Content-Type: application/json {"productId": 101, "quantity": 2} ``` * **IDEA**: 内置 **HTTP Client** (类似功能) 2. **数据库变更管理**: * **IDEA Database Tool** 记录执行的 SQL,结合 Flyway/Liquibase(独立库,非 Spring Boot 嵌入)进行版本控制[^3]。 3. **热部署**: * **IDEA**: 使用 **JRebel** 插件实现 Java 代码热更新(商业版)。 * **VS Code**: Vue/React 本身具备热模块替换 (HMR)。 4. **安全**: * **身份认证**:在 `Servlet Filter` 或 `SparkJava Before Filter` 中实现 JWT 验证。 * **授权**:在业务代码或 Filter 中检查角色 (`user.role`)。 5. **性能**: * **连接池**:配置 **HikariCP** DataSource。 * **SQL 优化**:使用 `EXPLAIN` 分析慢查询(在 SQLQuery 或 IDEA DB Console 中)[^1]。 * **缓存**:在 Service 层引入手动缓存机制(如 `Caffeine`)。 --- ### 四、工作流图示 ```mermaid graph TD A[VS Code 前端开发] -->|调用 API| B[IDEA: SparkJava/Jetty API] B --> C[IDEA: Service/业务逻辑] C --> D[IDEA: DAO/JDBC操作] D --> E[(IDEA/SQLQuery: MySQL DB)] F[SQLQuery/IDEA DB Tool] -->|执行 DDL/DML| E F --> G[数据库变更脚本] G -.-> H[Flyway 版本控制] ``` --- ### 五、核心优势 * **极简可控**:技术栈轻量,消除 Spring Boot 魔法,依赖清晰。 * **深度掌控**:程序员直接面对底层API(Servlet/JDBC),理解更透彻。 * **灵活自由**:可按需选择组件库,没有框架强约束。 * **资源占用低**:更小的内存占用,更适合资源有限或简单系统。 **总结**:通过核心Java Web技术(Servlet/JSP)、微框架(SparkJava)、原生JDBC结合现代前端(Vue/React),搭配IDEA、VS Code和SQL工具的强功能,完全可以高效地构建和维护一个不依赖Spring Boot的超市销售系统。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值