当前位置: 首页 > news >正文

Maven基础使用

Maven

学习目标

  • 理解Maven的用途
  • 掌握Maven的基本操作
  • 掌握Maven如何创建Web项目

Maven是什么

面临问题

在学习Maven之前,我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统,项目中肯定要用到一些jar包,比如说mybatis,log4j,JUnit等,除了这些之外,你有可能用到你的同事开发的其他的东西,比如说别人做了一个财务模块或做了一个结算的模块,你在这里边有可能要用到这些东西。

假如有一天你们的项目中mybatis进行了一个升级,但是它内部使用的JUnit没有升级,你升级以后的mybatis假如要用5.0的JUnit,而你项目中目前用的是4.0的,会不会冲突?必然会出问题!这个时候管理起来会比较麻烦,你需要各种调整。更有甚者,假如同事做的这些东西升级了但又没有通知你,这个时候,就会出现几种严重的问题:

(1)jar包不统一,jar不兼容

(2)工程升级维护过程操作繁琐

除此之外,还会有其它的一系列问题。那么要解决这些问题,就用到了我们今天要讲的Maven了。

Maven简介

img

官网地址:https://maven.apache.org/

Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)

Maven是用Java语言编写的。他管理的东西统统以面向对象的形式进行设计,最终他把一个项目看成一个对象,而这个对象叫做POM(project object model),即项目对象模型

我们说一个项目就是一个对象,作为对象的行为、对象的属性都有哪些呢?

Maven说我们需要编写一个pom.xml文件,Maven通过加载这个配置文件就可以知道我们项目的相关信息了!到这里我们知道了Maven离不开一个叫pom.xml的文件。因为这个文件代表就一个项目。

提个问题大家思考,如果我们做8个项目,对应的是1个pom文件,还是8个pom文件?肯定是8个!

那Maven是如何帮我们进行项目资源管理的呢?这就需要用到Maven中的第二个东西:依赖管理。这也是它的第二个核心!

所谓依赖管理就是maven对项目所有依赖资源的一种管理,它和项目之间是一种双向关系,即当我们做项目的时候maven的依赖管理可以帮助你去管理你所需要的其他资源,当其他的项目需要依赖我们项目的时候,maven也会把我们的项目当作一种资源去进行管理,这就是一种双向关系。

那maven的依赖管理它管理的这些资源存在哪儿呢?主要有三个位置:本地仓库,私服,中央仓库

本地仓库顾名思义就是存储在本地的一种资源仓库,如果本地仓库中没有相关资源,可以去私服上获取,私服也是一个资源仓库,只不过不在本地,是一种远程仓库,如果私服上也没有相关资源,可以去中央仓库去获取,中央仓库也是一种远程仓库。

Maven除了帮我们管理项目资源之外还能帮助我们对项目进行构建,管理项目的整个生命周期,当然它的这些功能需要使用一些相关的插件来完成,当然整个生命周期过程中插件是需要配合使用的,单独一个无法完成完整的生命周期。

Maven安装

下载安装包

Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。注意Maven不同版本对JDK的版本也是有一定要求:

  • Maven 3.3 要求 JDK 1.7 或以上

  • Maven 3.2 要求 JDK 1.6 或以上

  • Maven 3.0/3.1 要求 JDK 1.5 或以上

Maven下载地址: https://maven.apache.org/download.cgi

img

解压安装包

安装路径可自行选择,但是要求路径中不能出现中文或者空格,本讲义中软件放在了D:\dev\apache-maven-3.8.1下。

image-20210630090347267

设置 Maven 环境变量

进入环境变量设置界面,配置Path

image-20210630091209912

测试配置效果

进入CMD控制台,输入命令mvn -v,如果出现下列界面则配置成功

image-20210630091335154

如果出现下述界面,则配置失败,检查环境变量路径即可

image-20210630091512800

仓库介绍

在 Maven 的术语中,仓库是一个位置(place)。

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

Maven 仓库有三种类型:

  • 本地(local):开发者自己电脑上存储资源的仓库,也可从远程仓库获取资源
  • 中央(central):maven团队自身维护的仓库,属于开源的
  • 远程(remote):第三方团队维护的仓库

img

私服介绍

私服:各公司/部门等小范围内存储资源的仓库,私服也可以从中央仓库获取资源

私服的作用:

(1)保存具有版权的资源,包含购买或自主研发的jar

(2)一定范围内共享资源,能做到仅对内不对外开放

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version>
</dependency>

坐标

我们说maven的仓库里存储了各种各样的资源(jar包),那这些资源我们如何找到它们呢?我们需要知道它们具体的一个位置才能知道如何找到它们,这个就叫坐标

坐标:maven中的坐标用于描述仓库中资源的位置

https://repo1.maven.org/maven2/

那maven中的坐标是如何构成的呢?

maven坐标的主要组成如下:

groupId:定义当前资源隶属组织名称(通常是域名反写,如:org.mybatis;com.itheima)

artifactId:定义当前资源的名称(通常是项目或模块名称,如:crm,sms)

version:定义当前资源的版本号

packaging:定义资源的打包方式,取值一般有如下三种

(1)jar:该资源打成jar包,默认是jar

(2)war:该资源打成war包

(3)pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构

如果要查询maven某一个资源的坐标,我们通常可以去maven的仓库进行查询,

https://mvnrepository.com/,在该网站中可直接搜索想要的资源,然后就能得到该资源的坐标

输入资源名称进行检索

点击你想要的资源进行查看

选择版本查看坐标

maven坐标的作用:

使用唯一标识,唯一性定义资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。

配置Maven本地仓库位置

找到maven目录下的conf目录,拷贝settings.xml到C:\Users\自己的用户名\.m2目录下

image-20210630100403974

image-20210704230531444

image-20210630100644232

配置阿里镜像

C:\Users\自己的用户名\\.m2目录下,创建settings.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><localRepository>D:\repository_ali</localRepository><mirrors><!--阿里镜像地址--><mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></mirror></mirrors><profiles><profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties></profile></profiles>
</settings>

阿里云一定要配置,直接连接maven中央仓库的时候,速度会比较慢。

maven的本地仓库文件夹可以任意删除,任意拷贝给其他同学用

maven的jar包如果下载失败了,如果想再次下载,需要手动的删除该jar包所在的文件夹

IDEA中创建Maven项目

新建Maven项目

image-20210630105225603

指定项目名和包名

image-20210630110355075

创建完成之后的项目目录结构

image-20210630110859726

完整的项目目录结构介绍

目录目的
${basedir}存放pom.xml和所有的子目录
${basedir}/src/main/java项目的java源代码
${basedir}/src/main/resources项目的资源,比如说property文件,springmvc.xml
${basedir}/src/test/java项目的测试类,比如说Junit代码
${basedir}/src/test/resources测试用的资源
${basedir}/src/main/webapp/WEB-INFweb应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
${basedir}/target打包输出目录
${basedir}/target/classes编译输出目录
${basedir}/target/test-classes测试编译输出目录
${basedir}/pom.xml项目核心配置文件

pom.xml介绍

每一个Maven项目的根目录下都包含一个pom.xml。

pom.xml都会包含最基础的下列配置信息

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--groupId:项目的名称,项目名称一般以公司域名的倒序例如: 西亚斯官网地址:https://www.sias.edu.cn/groupId为: cn.edu.sias--><groupId>com.iflytek</groupId><!--artifactId:模块名称(子项目名称)--><artifactId>maven01</artifactId><!--Version:模块的版本,snapshot(快照版,没有正式发行)、release(正式发行版本)--><version>1.0-SNAPSHOT</version>
</project>

Idea的Maven视图窗口

强大的idea对Maven支持非常友好,在idea的右侧有专属的Maven视图,其中有Maven项目的常用命令和常用插件。

编写测试代码

接下来,我们编写一段JDBC代码来进一步学习Maven知识。

在MySql准备测试表

CREATE TABLE `t_user` (`uid` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`birthday` date DEFAULT NULL,`sex` char(1) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL,PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

添加Jar包

在以往的学习中,我们如果想要编写JDBC代码,我们则需要添下载相关jar包,并拷贝到项目当中。

而在Maven中,我们则只需要添加xml片段,即可让Maven帮助我们去完成Jar包的添加。

  1. 我们去下面网址中寻找对应的jar包的xml片段

https://mvnrepository.com/

image-20210630131307427
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version>
</dependency>
  1. 把查询到的xml片段粘贴到pom.xml中

image-20210630131507522

  1. 刷新工程,下载相关依赖包,下载完毕之后,观察右侧Maven视图

image-20210630131609175

image-20210630134419875

测试Java代码

package com.iflytek;import java.sql.*;public class JdbcDemo01 {public static void main(String[] args) throws Exception {//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/test";//通过DriverManager获取连接Connection conn = DriverManager.getConnection(url, "root", "12345678");// 编写预处理SQLPreparedStatement ps = conn.prepareStatement("select * from t_user");// 执行查询ResultSet rs = ps.executeQuery();// 遍历查询结果while(rs.next()){String name = rs.getString("name");System.out.println(name);}conn.close();}
}

项目生命周期

Maven有三套相互独立的生命周期,分别是:clean、default、site。

clean主要是清理项目、default是Maven最核心的的构建项目、site是生成项目站点。

每一个大的生命周期又分为很多个阶段。

后面的阶段依赖于前面的阶段,这点有点像Ant的构建依赖。

生命周期本身相互独立,用户可以仅仅调用生命周期的某一个阶段,也就是说用户调用了default周期的任何阶段,并不会触发clean周期以及site周期的任何事情。

三大生命周期蕴含着小小的阶段,我们按顺序看一下:

img

常用命令如下:

  • compile:编译
  • clean:清理,将target下的class文件清理
  • test: 执行单元测试类,执行src/test/java下的类
  • package :将java工程打成jar、war。
  • install:安装命令,将工程的jar发布到本地仓库

了解:

(1)clean周期:

pre-clean:准备清理
clean:真正的清理工作
post-clean:执行清理后的一些后续工作

(2)default周期:

validate:验证
initialize:初始化配置
generate-sources:生成源代码编译目录
process-sources:处理项目主资源文件,复制资源文件到outputclasspath
generate-resources:生成资源目录
process-resources:处理资源文件
complie:编译源代码
process-classes:处理编译后文件
generate-test-sources:生成测试目录
process-test-sources:处理项目测试资源文件,复制测试资源文件到outputclasspath
generate-test-resources:生成测试资源文件
process-test-resources:处理测试资源文件
test-compile:编译测试代码
process-test-classes:处理测试代码
test:单元测试运行测试代码
prepare-package:打包前的准备
package:将编译好的代码打包成为jar或者war或者ear等等
pre-integration-test:准备整体测试
integration-test:整体测试
post-integration-test:为整体测试收尾
verify:验证
install:安装到本地Maven库
deploy:将最终包部署到远程Maven仓库

(3)site周期:

pre-site:准备生成站点
site:生成站点及文档
post-site:站点收尾
site-deploy:将生成的站点发布到服务器上

简单回顾:

  • package : 打包,jar包、war包到target目录
  • compile : 编译源码,生成classes文件到target目录
  • clean : 删除target目录的所有内容
  • install : 安装打包之后的文件到本地仓库中,其他工程可以直接引用
  • deploy : 部署打包之后的文件到公司服务器中

创建Web项目

在idea中创建Maven版的web项目和Java项目类似。网上有资料介绍可以使用Maven骨架去创建项目,但是创建的项目会缺失部分文件夹,所以不建议使用骨架。(可以自行尝试)

image-20210903142450557

新建Maven项目

image-20210630162112838 image-20210630162131829 image-20210630162257251

创建webapp目录

image-20210630162609532

修改项目打包方式

image-20210630162806847

创建web.xml

注意:web.xml需要放在WEB-INF目录下,不是WEB_INF!!!

image-20210630165104881

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"></web-app>

添加相关依赖

<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency>
</dependencies>

创建测试Servlet代码

package com.iflytek;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet(name = "Servlet01", urlPatterns = {"/hello"})
public class Servlet01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getOutputStream().println("Hello World!");}
}

添加tomcat7插件

由于官网没有提供tomcat8插件,所以我们选择tomcat7插件即可

<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><path>/</path><port>9090</port></configuration></plugin></plugins>
</build>

运行项目

直接点击插件,即可运行项目,这种方式比部署到tomcat中要方便很多,在工作中比较常用。

image-20210630165418435

启动日志

image-20210630165557101

浏览器访问

image-20210630165700569

思考:

为什么访问http://localhost:9090/会出现404,而不是熟悉的那只tomcat猫?

image-20210630165720660

image-20210630165813312

快捷启动插件

image-20210903153244477

image-20210903153322822

总结

  • 新建Maven项目(可以使用骨架)

  • 添加缺失的webapp/WEB-INF/web.xml

    • webapp文件夹图标需要有小蓝点[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjPh27A0-1684303534012)(https://imags-1259764475.cos.ap-nanjing.myqcloud.com/img/202305171404440.png)]

    • WEB-INF目录注意是横线,不是下划线

    • web.xml里边不能是空白

  • 添加Servlet和jsp的依赖

  • 新建测试Servlet

  • 添加tomcat7的插件

  • 运行tomcat7的插件启动测试即可

Maven依赖管理

依赖配置与依赖传递

依赖是指在当前项目中运行所需的jar,依赖配置的格式如下图

依赖传递:

依赖具有传递性,分两种

(1)直接依赖:在当前项目中通过依赖配置建立的依赖关系

(2)间接依赖:被依赖的资源如果依赖其他资源,则表明当前项目间接依赖其他资源

注意:直接依赖和间接依赖其实也是一个相对关系

依赖传递的冲突问题:

在依赖传递过程中产生了冲突,我们有三种优先法则

(1)路径优先:当依赖中出现相同资源时,层级越深,优先级越低,反之则越高

(2)声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖靠后的

(3)特殊优先:当同级配置了相同资源的不同版本时,后配置的覆盖先配置的

可选依赖

排除依赖:

依赖范围

依赖的jar默认情况可以在任何地方可用,可以通过scope标签设定其作用范围

这里的范围主要是指以下三种范围

(1)主程序范围有效(src/main目录范围内)

(2)测试程序范围内有效(src/test目录范围内)

(3)是否参与打包(package指令范围内)

此外:scope标签的取值有四种:compile,test,provided,runtime

这四种取值与范围的对应情况如下:

依赖范围的传递性:

聚合与继承

聚合

随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采用各种方式进行开发,于是就有了我们的分层架构、分模块开发,来提高代码的清晰和重用。针对于这一特性,maven也给予了相应的配置。

我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。

所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven 工程。

建立该project的时候,我们要注意以下几点:

1.聚合模块本身也做为一个Maven项目,它必须有自己的POM

2.它的打包方式必须为: pom

3.引入了新的元素:modules—module

4.版本:聚合模块的版本和被聚合模块版本一致

5.相对目录:每个module的值都是一个当前POM的相对目录

6.目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和模块所处的目录相一致。

7.习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM

8.聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。

9.聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。

继承

我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每个模块都需要Junit,使用spring的时候,其核心jar也必须都被引入,在编译的时候,maven-compiler-plugin插件也要被引入。这时我们采用继承,就不用在每个子模块分别定义了。

如何配置继承:

1.说到继承肯定是一个父子结构,那么我们在父工程中来创建一个parent project

2.: 作为父模块的POM,其打包类型也必须为POM

3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录

4.新的元素: , 它是被用在子模块中的

5.元素的属性:: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找

6.relativePath的默认值: …/pom.xml

7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素

聚合与继承的区别

img

聚合和继承通常是结合使用的,但是其作用是不同的。聚合是将多个模块的工程汇聚到一起,而继承则是指明某个模块工程要继承另一个模块功能。

分模块开发与设计

工程模块与划分

image-20210903121027238

分层架构

image-20210903121746493

Bean

package org.example.bean;public class User {private int uid;private String name;private String birthday;private String sex;private String phone;public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}
}

Dao

package org.example.dao;import org.example.bean.User;public class UserDao {public User findById(int uid) {// 查询数据库return new User();}}

Service

package org.example.service;import org.example.bean.User;
import org.example.dao.UserDao;public class UserService {UserDao userDao;public User findById(int uid) {// 调用Dao的方法return userDao.findById(uid);}public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}
}

Controller

package org.example.controller;import org.example.bean.User;
import org.example.service.UserService;public class UserController {UserService userService;public User findById(int uid) {// 调用Dao的方法return userService.findById(uid);}public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}
}

父项目的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ssm_02</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>ssm_bean</module><module>ssm_dao</module><module>ssm_service</module><module>ssm_controller</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

属性

属性类别:自定义属性

  • 作用: 抽取变量,统一维护

image-20210903122239627

image-20210903122359987

相关文章:

Maven基础使用

Maven 学习目标 理解Maven的用途掌握Maven的基本操作掌握Maven如何创建Web项目 Maven是什么 面临问题 在学习Maven之前&#xff0c;我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统&#xff0c;项目中肯定要用到一些jar包&#xff0c;比如说myb…...

【C++ 入坑指南】(06)运算符

文章目录 一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、算法题5.1、拆分位数 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 运算符类型作用算术运算符用于处理四则运算赋值…...

了解一下js中的函数式编程

js中的函数式编程是一种编程范式&#xff0c;它将函数作为一等公民来使用。 在函数式编程中&#xff0c;函数是一种特殊的对象&#xff0c;可以赋值给变量、作为参数传递给其他函数、或作为其他函数的返回值。 函数式编程强调了函数的纯函数性&#xff0c;即函数输入相同时&a…...

动态HTTP代理在linux里的使用

动态HTTP代理是一种可以自动切换代理IP地址的代理方式&#xff0c;可以有效地绕过一些限制访问的网站。在Linux系统中&#xff0c;可以使用Privoxy和Proxychains来实现动态HTTP代理。 以下是在Linux中使用动态HTTP代理的步骤&#xff1a; 1. 安装Privoxy和Proxychains 在终端中…...

软考证书值得考吗?怎么考?

软考证书是什么&#xff1f;有什么用处&#xff1f;必须先明确这两个问题&#xff0c;才能有复习和考取的动力。怎么考过&#xff1f;这是第二步要着重解决的问题。今天详细帮助大家分析一下。 软考是国家级考试&#xff0c;具有强大的权威性与公信力。 软考全称为计算机技术…...

超级秘密文件夹忘记密码的解决办法

超级秘密文件夹是一款非常特殊的文件夹加密软件&#xff0c;它来无影去无踪&#xff0c;在安装后不会留下任何痕迹&#xff0c;只能通过软件热键才能打开。那么如果在使用过程中忘记了密码&#xff0c;这时我们该怎么办呢&#xff1f;下面我们就来了解一下。 首先&#xff0c;我…...

脑的物理系统

⼤脑模块化 人脑是一个复杂的网络&#xff0c;一般将大脑划分为不同的区域&#xff08;即节点&#xff09;&#xff0c;并使用某种方法表征大脑区域之间的关系&#xff08;即连接的边&#xff09;来构建人脑网络。在功能磁共振成像&#xff08;fMRI&#xff09;数据的网络模型…...

1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c++实现

1054. 距离相等的条形码&#xff08;leetcode,堆问题&#xff0c;priority_queue&#xff09;-------------------c实现 题目表述 在一个仓库里&#xff0c;有一排条形码&#xff0c;其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码&#xff0c;使其中任意两个相…...

QT开发实战-动态壁纸软件

动态壁纸软件开发 项目源代码在下面链接获取: ----------------------------- 开发者:CodeSharkSJ 希望此项目能加强你对Qt的应用 文章目录 项目图与开发环境核心技术原理自定义窗口程序UI布局背景绘制样式表基本实现QWebEngineQMedia使用系统托盘隐藏记忆功能应用程序打包 …...

Netty核心组件模块(一)

1.Bootstrap和ServerBootstrap 1>.Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类; 2>.常见的方法有: ①.public ServerBootstr…...

Robot Framework+Jenkins持续集成UI自动化项目

使用Robot Framework框架可进行Web端和APP端的UI自动化测试&#xff0c;为方便定时执行&#xff0c;可将Robot Framework的自动化项目持续集成至Jenkins平台&#xff0c;具体的操作步骤如下&#xff1a; 安装Jenkins的步骤如下&#xff1a; 手把手教小白安装Jenkins_程序员馨馨…...

【ROS】ROS1编程速览

1、简述 很多项目已经转向ROS2&#xff0c;本人作为ROS小白从ROS1开始学起&#xff0c;但是不会深入学习ROS1&#xff0c;只一带而过。 下面只了解一些ROS1中的概念和基本编程接口。 ROS1中有两种通信模式&#xff1a;话题模式和服务模式&#xff0c;区别如下 2、话题模式 …...

探索智能化:TOOM解析未来稿件校验系统的技术进展与应用展望

在信息时代&#xff0c;随着大数据、人工智能和自然语言处理等技术的快速发展&#xff0c;稿件校验系统正朝着智能化的方向迈进。智能化的稿件校验系统能够更准确、高效地检测虚假信息、抄袭行为以及提升文章质量。本文将探讨智能化稿件校验系统的技术进展与应用展望&#xff0…...

Java程序员从青铜到王者,不同段位的薪资和技能变化

想要薪资高&#xff0c;段位就得跟上&#xff0c;对于Java程序员来说&#xff0c;从青铜到王者&#xff0c;需要经历多个阶段&#xff0c;每个阶段需要掌握的技能都不一样。 今天&#xff0c;我们一起来看看每个段位都有什么特点、需要具备哪些“大杀”技能&#xff0c;也看看…...

tinyWebServer 学习笔记——二、HTTP 连接处理

文章目录 一、基础知识1. epoll2. 再谈 I/O 复用3. 触发模式和 EPOLLONESHOT4. HTTP 报文5. HTTP 状态码6. 有限状态机7. 主从状态机8. HTTP_CODE9. HTTP 处理流程 二、代码解析1. HTTP 类2. 读取客户数据2. epoll 事件相关3. 接收 HTTP 请求4. HTTP 报文解析5. HTTP 请求响应 …...

深入浅析Linux Perf 性能分析工具及火焰图

Perf Event 子系统 Perf 是内置于 Linux 内核源码树中的性能剖析&#xff08;profiling&#xff09;工具。它基于事件采样的原理&#xff0c;以性能事件为基础&#xff0c;支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位…...

java关键术语

java具有11个关键的术语,这些术语是从java的设计者所编写的白皮书中摘取,这些术语分别为:简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释型、高性能、多线程、多态性。以下开始我们将逐一解说这些术语。 一、简单性 Java是C++语法的纯净版本,剔…...

1. 两数之和【简单】

题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺…...

《编码——隐匿在计算机软硬件背后的语言》精炼——第17章(自动操作)

夫道成于学而藏于书&#xff0c;学进于振而废于穷。 文章目录 完善加法器加入代码的加法器扩大加数范围自由调用地址的加法器合并代码RAM和数据RAMJump指令硬件实现条件Jump指令零转移的硬件实现条件Jump指令的例子 总结 完善加法器 我们在第14章介绍了一个可以进行连加的加法…...

用Colab免费部署AI绘画云平台Stable Diffusion webUI

Google Colab 版的 Stable Diffusion WebUI 1.4 webui github 地址&#xff1a;https://github.com/sd-webui/stable-diffusion-webui 平台搭建 今天就来交大家如果来搭建和使用这个云平台。 第一步: 打开链接 https://colab.research.google.com/github/altryne/sd-webu…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...