每个阿里程序员都必须搞懂的Maven基础知识

Maven的下载安装配置教程(详细图文) 目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一.. 阅读详情

以前的日子

以前我们写代码时,jar包都默认放在一个叫 /lib 的目录下,然后把该目录设置为classpath可以读取到的目录,如下图所示:

640?wx_fmt=png

某一天我们新加了一个功能,需要用到一个比较古老的 z.jar 包,这时我们到网上去各种搜索,由于比较罕见,最终在某个 xxx软件园 中找到了他。然后我们把 z.jar 包拷贝到 /lib 目录下:

640?wx_fmt=png

这时运行后报了一堆的错,原因是 z.jar 包有很多的依赖项,分别是 z1.jar , z2.jar , z3.jar。这时的你是否有种想要骂人的冲动?但是冲动归冲动,代码还是要写,jar包还是要找,自己挖的坑,哭着也要填完啊。

历经千难万险,终于在1个博客中找到了 z1.jar , z2.jar , z3.jar 的下载链接,但是需要支付积分才能下载。。为了得到这些jar包,我们又注册了一个账号,发了几个评论,赚到足够的积分后,终于把那三个jar包下载下来了。然后赶紧把他们拷贝到 /lib下去:

640?wx_fmt=png

凑够了jar包之后,再次运行项目,终于能成功运行了,真是谢天谢地!

过了半个月,老板说我们 项目A 非常不错,现在我们准备再启动一个 项目B 作为他的兄弟项目。这时你开始搭建 项目B 的框架了,把所有需要用到的jar包从 项目A 拷贝到 项目B 中:

640?wx_fmt=png

从此你又开始了打怪升级的日子了。

现在的日子

随着科技的发展,改革开放的浪潮席卷了大地,也席卷了IT界,一大堆生产力工具被创造出来了,俗话说的好,工欲善其事必先利其器。有了好的生产力工具,要做的事必定是事半功倍!而 Maven 就是一种为了解放我们程序猿的生产力工具。

程序猿在日常工作中需要用到大量的jar包,有的是框架包如:netty,sentinel等,有的是工具包如:hutool,有的是公司内部的私有包如:xx-framework等等。

一个项目中可能充斥着各种各样的jar包,如果我们用手工的方式去一个一个的管理的话,那样就会迷失在jar包的海洋里,这时我们通过 Maven 这种管理jar包的工具来帮助我们解决这个繁琐又棘手的问题,可以让我们专心于自己的功能与业务。

其实 Maven 是一套软件工程管理和整合工具。他有很多的功能包括但不限于以下几点:

  • 工程的创建、构建、测试

  • 依赖的管理

  • 仓库的管理

  • 自动化部署

  • 。。。

我们日常中用的最多的可能就是工程与依赖的管理了,其他的用到的频率不多。

有了 Maven 之后,我们:

  • 不需要为每个项目都创建一个 /lib 目录用来存放各种jar包了

  • 不需要为到哪去寻找我需要的jar包而发愁了

  • 不需要为引用的jar包去寻找他所依赖的jar包了

  • 。。。

结构

下面是一个典型的maven项目的结构图:

640?wx_fmt=png

仓库

在 Maven 的术语中,仓库是一个位置(place),例如目录,可以存储所有的工程 jar 文件、library jar 文 件、插件或任何其他的工程指定的文件。

严格意义上说,Maven 只有两种类型的仓库:

  • 本地(local)

  • 远程(remote)

本地仓库

Maven 的本地仓库是机器上的一个文件夹。它在你第一次运行任何 maven 命令的时候创建。

Maven 的本地仓库保存你的工程的所有依赖(library jar、plugin jar 等)。当你运行一次 Maven 构建时,Maven 会自动下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用存放在远程仓库上的依赖文件。

Maven 的本地仓库默认被创建在 ${user.home}/.m2/repository 目录下。要修改默认位置,只要在 settings.xml 文件中定义另一个路径即可,例如:

<localRepository>/anotherDirectory/.m2/respository</localRepository>

远程仓库

Maven 的远程仓库可以是任何其他类型的存储库,可通过各种协议,例如 file://和 http:// 来访问。

这些存储库可以是由第三方提供的可供下载的远程仓库,例如Maven 的中央仓库(central repository):

repo.maven.apache.org/maven2

uk.maven.org/maven2

也可以是在公司内的FTP服务器或HTTP服务器上设置的内部存储库,用于在开发团队和发布之间共享私有的 artifacts。

中央仓库

Maven 的中央仓库是 Maven 社区维护的,里面包含了大量常用的库,我们可以直接引用,但是前提是我们的项目能够访问外网。

私有仓库

除了 Maven 的中央仓库外,还有一种就是私有仓库,这种仓库通常都是企业内部创建的一个私有库,用于一些内部jar包的维护与共享。由于网络原因和鉴于安全性的考虑,很多公司的内外网是隔离的,要想直接访问中央仓库是不可能的,并且直接把内部资源暴露在互联网上也是非常危险的,所以这时就需要创建一个私有库。

那这些仓库之间的关系是怎样的呢?或者说一个 Maven 项目想要获取一个jar包的话,他该从哪个仓库中去获取呢?下图就是一个简单的描述:

640?wx_fmt=png

首先 Maven 会到本地仓库中去寻找所需要的jar吧,如果找不到就会到配置的私有仓库中去找,如果私有仓库中也找不到的话,就会到配置的中央仓库中去找,如果还是找不到就会报错。但是这中间只要在某一个仓库中找到了就会返回了,除非仓库中有更新的版本,或者是snapshot版本。

那么 Maven 的远程仓库是怎么配置的呢?假设我们要配置一个中央仓库,可以像下面这样配置:

<project>	
...	
    <profiles>	
        <profile>  	
            <id>central</id>  	
            <repositories>	
                <repository>	
                    <id>Central</id>	
                    <name>Central</name>	
                    <url>http://repo.maven.apache.org/maven2/</url>	
                </repository>	
            </repositories>	
        </profile>	
    </profiles>	
    <activeProfiles>	
        <activeProfile>central</activeProfile>	
    </activeProfiles>	
...	
</project>

最佳实践

但是官方并不推荐直接配置远程仓库,例如直接配置一个中央仓库,而是通过 仓库管理器来下载我们所需要的jar包。试想一下如果你所在的公司有几千甚至上万的开发者,每个人都单独配置一个中央仓库,那每个人都到中央仓库中去下载所需的jar,这就退化成最原始的模式,并且是一个巨大的资源浪费。

那什么是 仓库管理器 呢?仓库管理器是一种专用服务器应用程序,目的是用来管理二进制组件的存储库。对于任何使用 Maven 的项目,仓库管理器的使用被认为是必不可少的最佳实践。

仓库管理器提供了以下基本用途:

  • 充当中央Maven存储库的专用代理服务器

  • 提供存储库作为Maven项目输出的部署目标

使用仓库管理器可以获得以下优点和功能:

  • 显著减少了远程存储库的下载次数,节省了时间和带宽,从而提高了构建性能

  • 由于减少了对外部存储库的依赖,提高了构建稳定性

  • 与远程SNAPSHOT存储库交互的性能提高

  • 提供了一个有效的平台,用于在组织内外交换二进制工件,而无需从源代码中构建工件

  • 。。。

已知的开源和商业存储库管理器有以下这些:

  • Apache Archiva(开源)

  • CloudRepo(商业)

  • Cloudsmith套餐(商业)

  • JFrog Artifactory开源(开源)

  • JFrog Artifactory Pro(商业)

  • Sonatype Nexus OSS(开源)

  • Sonatype Nexus Pro(商业)

  • packagecloud.io(商业)

镜像

Mirror 则相当于一个代理,它会拦截去指定的远程 Repository 下载构件的请求,然后从自己这里找出构件回送给客户端。配置 Mirror 的目的一般是出于网速考虑。

Repository 和 Mirror 是两个不同的概念:前者本身是一个仓库,可以堆外提供服务,而后者本身并不是一个仓库,它只是远程仓库的网络加速器。

需要注意的是很多本地仓库搭建工具往往也提供 Mirror 服务,比如Nexus就可以让同一个URL,既用作 internalrepository,又使它成为所有 repository 的 Mirror。

如果 仓库X 可以提供 仓库Y 存储的所有内容,那么就可以认为 X是Y的一个镜像。这也意味着,任何一个可以从某个仓库中获得的构件,都可以从它的镜像中获取。

举个例子:http://maven.net.cn/content/groups/public/ 是中央仓库 http://repo1.maven.org/maven2/ 在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。

因此,可以在Maven中配置该镜像来替代中央仓库。在settings.xml中配置如下代码:

<settings>	
  ...	
  <mirrors>	
    <mirror>	
      <id>maven.net.cn</id>	
      <mirrorOf>central</mirrorOf>	
      <name>one of the central mirrors in china</name>	
      <url>http://maven.net.cn/content/groups/public/</url>	
    </mirror>	
  </mirrors>	
  ...	
</settings>

\的值为central,表示该镜像是中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,如下图所示:

640?wx_fmt=png

对于镜像的最佳实践是结合私服。由于私服可以代理任何外部的公共仓库(包括中央仓库),因此,对于组织内部的Maven用户来说,使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化Maven本身的配置。在这种情况下,任何需要的构件都可以从私服获得,私服就是所有仓库的镜像。

例如可以这样来配置一个代理所有仓库的镜像:

<settings>	
  ...	
  <mirrors>	
    <mirror>	
      <id>internal-repository</id>	
      <name>Internal Repository Manager</name>	
      <url>internal-repository-url</url>	
      <mirrorOf>*</mirrorOf>	
    </mirror>	
  </mirrors>	
  ...	
</settings>

\的值为星号,表示该镜像是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至: internal-repository-url 这个地址。

下面给出一张 Maven 官方的架构图:

640?wx_fmt=png

生命周期

生命周期是由 一组 有 顺序 的 阶段 构成的一个整体,这么说可能有点绕,那让我们来关注他里面的几个重要的点:

  • 一组:指的是可能有多个

  • 顺序:指的是按照顺序执行,执行某一个阶段的指令时会依次先执行该阶段之前的指令

  • 阶段:指的是具体要执行的内容

例如 Maven 有三个内置的构建生命周期: default, clean 和 site。每个生命周期都由一系列的阶段所构成,比如 default 生命周期的一个简易阶段如下,完整的生命周期请参考官方文档:

640?wx_fmt=png

上图中的每一个节点都是一个 阶段 ,阶段的执行是按顺序的,一个阶段执行完成之后才会执行下一个阶段。比如我们执行了一个如下的指令:

mvn install

他实际会执行 install 阶段之前的所有阶段,然后才会执行 install 阶段本身。

PS:当我们的项目是多模块的,我们在最顶层执行该指令时,Maven 会遍历每一个子模块,依次执行所有的阶段。

坐标

说到 Maven 的坐标,我们首先就需要想到 GAV ,即 groupId artifactId version。由这三个属性就可以唯一确定一个jar包了。其中每个属性的意义如下:

  • groupId:表示一个团体,可以是公司、组织等

  • artifactId:表示团体下的某个项目

  • version:表示某个项目的版本号

他们之间的关系是一对多的,即每个团体下可以有多个项目,每个项目可以有多个版本号,可以用下面这张图来表示:

640?wx_fmt=png

依赖

Maven 核心特点之一是依赖管理。一旦我们开始处理多模块工程(包含数百个子模块或者子工程)的时候,模块 间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。

依赖传递

依赖传递很好理解,假设 B 依赖于 C,当 A 需要依赖 B 时,则 A 自动获得了对 C 的依赖。依赖传递有时非常好,当我们需要依赖很多jar包时,我们可以声明一个包来依赖所有的jar,然后只要依赖这个包就可以了。但是有时又很麻烦,因为很可能会造成依赖的冲突。

依赖冲突

当同一个项目中由于不同的jar包依赖了相同的jar包,此时就会发生依赖冲突的情况,如下图所示:

640?wx_fmt=png

当项目中依赖了a和c,而a和c都依赖了b,这时就造成了冲突。为了避免冲突的产生,Maven 使用了两种策略来解决冲突,分别是 短路优先 和 声明优先 。

短路优先

短路优先的意识是,从项目一直到最终依赖的jar的距离,哪个距离短就依赖哪个,距离长的将被忽略掉。例如下图所示:

640?wx_fmt=png

声明优先

声明优先的意思是,通过jar包声明的顺序来决定使用哪个,最先声明的jar包总是被选中,后声明的jar包则会被忽略,如下图所示:

640?wx_fmt=png

依赖排除

如果我们只想引用我们直接依赖的jar包,而不想把间接依赖的jar包也引入的话,那可以使用依赖排除的方式,将间接引用的jar包排除掉,如下面的配置所示:

<exclusions>	
    <exclusion>	
        <groupId>excluded.groupId</groupId>	
        <artifactId>excluded-artifactId</artifactId>	
    </exclusion>	
</exclusions>

解决冲突

项目中出现冲突,大体都是因为上面所描述的原因,然后 Maven 在选择jar包时,选择了一个错的包,导致出现问题,这时我们就需要人为来干预他,告诉 Maven 使用哪个正取的包。下面让我举个例子来说明冲突产生后该如何解决。

我们原本运行得好好的一个项目,突然有一次启动的时候,报错了,如下图所示:

640?wx_fmt=png

可以看到有报了一个 NoSuchMethodError ,看到这个错,多半都是因为冲突导致的。

错误说的是找不到 javax.servlet.ServletContext 类中的 getVirtualServerName 方法了,那我们在 idea 中搜索一下 javax.servlet.ServletContext 类,看看是否存在多个的情况,如下图所示:

640?wx_fmt=png

可以发现确实在两个jar包中都找到了 javax.servlet.ServletContext 这个类,那我们打开他们看看哪个类没有我们需要方法:

640?wx_fmt=png

可以很清楚的看到,在 servlet-api-3.0.jar 包中没有找到我们需要的方法,而 Maven 肯定是选择了这个包。那就让我们来看下依赖树吧,看看 Maven 是怎样选择了错误的包的。

在项目目录中输入如下指令:

mvn dependency:tree -Dverbose -Dincludes=javax.servlet:servlet-api

Maven 将打印出 servlet-api-3.0.jar 的包的依赖树,如下图所示:

640?wx_fmt=png

然后在输入如下指令:

mvn dependency:tree -Dverbose -Dincludes=org.apache.tomcat.embed:tomcat-embed-core

Maven 将打印出 tomcat-embed-core-8.5.31.jar 的包的依赖树,如下图所示:

640?wx_fmt=png

我们分析下原因,从 Maven 中打印出的依赖树来看,发现很奇怪的事:

servlet-api-3.0.jar 包是在 xx-service 模块中引入的,从 xx-web 到他的深度为6,

tomcat-embed-core-8.5.31.jar 包是在 xx-web 模块中引入的,从 xx-web 到他的深度为3。

那按照短路优先的规则,Maven 应该会选择 tomcat-embed-core-8.5.31.jar 包才对,现在没有选择他,那原因肯定只有一个了:声明优先!

说明 servlet-api-3.0.jar 包比 tomcat-embed-core-8.5.31.jar 包先声明。

我们发现 servlet-api-3.0.jar 包是在 xx-service 中被引入的,

而 tomcat-embed-core-8.5.31.jar 是在 spring-boot-starter-web 中被引入的。

那只要能证明在 xx-web 中 xx-service 先于 spring-boot-starter-web 声明就可以了,让我们去 xx-web 中看看:

640?wx_fmt=png

事实证明了我们的猜想是正确的, xx-service 确实比 spring-boot-starter-web 先声明!

可以用图形表示成如下:

640?wx_fmt=png

那知道原因了,要解决这个冲突,就很好办了,有两种方法:

  • 在 xx-web 中将 xx-service 放到 spring-boot-starter-web 后面声明

  • 在 xx-service 中找到引入 servlet-api-3.0.jar 包将他排除掉

依赖管理

聚合

将多个项目同时运行就称为聚合,如下就是一个多模块的项目:

<packaging>pom</packaging> 	
<modules>	
     <module>module-1</module>	
     <module>module-2</module>	
     <module>module-3</module>	
 </modules>

聚合的优势在于可以在一个地方编译多个 pom 文件。

PS:聚合时 packaging 必须要是 pom

继承

跟java类的继承类似,Maven 的继承特性也会继承父pom中的依赖,假设我们定义了一个父pom:

<groupId>com.houyi</groupId>	
<artifactId>maven-parent</artifactId> 	
<version>0.0.1-SNAPSHOT</version>	
<dependencyManagement>	
   <dependencies>	
        <dependency>	
            <groupId>junit</groupId> 	
            <artifactId>junit</artifactId> 	
            <version>${junit.version}</version> 	
            <scope>test</scope>	
      </dependency>	
      <dependency>	
            <groupId>mysql</groupId> 	
              <artifactId>mysql-connector-java</artifactId> 	
              <version>5.1.30</version>	
      </dependency>	
   </dependencies>	
</dependencyManagement>

然后在子pom中引入这个父pom:

<!-- 指定parent,说明是从哪个pom继承 -->	
<parent>	
    <groupId>com.houyi</groupId> 	
    <artifactId>maven-parent</artifactId> 	
    <version>0.0.1-SNAPSHOT</version>	
    <!-- 指定相对路径 --> 	
    <relativePath>../maven-parent</relativePath>	
</parent>	
<!-- 只需要指明groupId + artifactId,就可以到父pom找到了,无需指明版本 -->	
<dependencies>	
  <dependency>	
        <groupId>junit</groupId> 	
        <artifactId>junit</artifactId> 	
  </dependency>	
  <dependency>	
        <groupId>mysql</groupId> 	
          <artifactId>mysql-connector-java</artifactId> 	
  </dependency>	
</dependencies>

使用dependencyManagement,可对依赖进行管理。子类只要不引用这个里面写的groupId + artifactId,则不会添加依赖,这样防止造成重复加了包:如果不使用dependencyManagement,那么只要写了dependency,子pom中会全部添加到依赖中,而其中很多包可能都用不上。

插件

插件是 Maven 的核心,所有执行的操作都是基于插件来完成的。

为了让一个插件中可以实现众多的相类似的功能,Maven 为插件设定了目标,一个插件中有可能有多个目标。其实生命周期中的每个阶段都是由插件的一个具体目标来执行的

例如可以用下面的方式配置一个插件:

<build>	
   <plugins>	
        <plugin> 	
            <groupId>org.apache.maven.plugins</groupId>	
             <artifactId>maven-source-plugin</artifactId> 	
             <version>2.2.1</version>	
            <!-- 配置执行 -->	
            <executions>	
                 <execution>	
                     <phase>package</phase>	
                     <goals>	
                        <goal>jar-no-fork</goal>	
                     </goals>	
                 </execution>	
              </executions>	
          </plugin>	
       </plugins>	
</build>

配置目标 goal 的目的是:这样在执行 mvnpackage 的时候,就会自动执行 mvn source:jar-no-fork了,jar-no-fork这个目标是用来进行源码打包的。

除了可以在build元素中配置插件,当然也可以在parent项目中,用pluginManagement来配置,然后在子项目继承即可使用。

PS:通过插件我们可以做很多事,比如通过mybatis-generator 我们可以生成很多DAO层的代码,再配合通用Mapper+lombok使用的话就可以使你的代码非常简洁,绝对的生产力工具!

指令

下面列举一些常用的 maven 指令:

640?wx_fmt=png

指令参数

上面列举的只是比较通用的命令,其实很多命令都可以携带参数以执行更精准的任务。 Maven命令可携带的参数类型如下:

-D 传入属性参数

比如命令: mvnpackage-Dmaven.test.skip=true以 -D开头,将 maven.test.skip 的值设为 true ,就是告诉maven打包的时候跳过单元测试。

同理, mvn deploy-Dmaven.test.skip=true 代表部署项目并跳过单元测试。

-P 使用指定的Profile配置

比如项目开发需要有多个环境,一般为开发,测试,预发,正式4个环境,在pom.xml中的配置如下:

<profiles>	
  <profile>	
     <id>dev</id>	
     <properties>	
        <env>dev</env>	
     </properties>	
     <activation>	
        <activeByDefault>true</activeByDefault>	
     </activation>	
  </profile>	
  <profile>	
     <id>qa</id>	
     <properties>	
         <env>qa</env>	
     </properties>	
  </profile>	
  <profile>	
     <id>pre</id>	
     <properties>	
        <env>pre</env>	
     </properties>	
  </profile>	
  <profile>	
     <id>prod</id>	
     <properties>	
        <env>prod</env>	
     </properties>	
  </profile>	
</profiles>	
...	
<build>	
  <filters>	
        <filter>config/${env}.properties</filter>	
  </filters>	
  <resources>	
     <resource>	
        <directory>src/main/resources</directory>	
        <filtering>true</filtering>	
     </resource>	
  </resources>	
</build>

profiles定义了各个环境的变量 id, filters中定义了变量配置文件的地址,其中地址中的环境变量就是上面 profile中定义的值, resources中是定义哪些目录下的文件会被配置文件中定义的变量替换。

通过maven可以实现按不同环境进行打包部署,命令为:

mvn package -P dev

其中 dev 为环境的变量id,代表使用Id为 dev 的 profile。

-e 显示maven运行出错的信息
-o 离线执行命令,即不去远程仓库更新包
-X 显示maven允许的debug信息
-U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次

举个例子

将自己的jar包部署到远程仓库去,可以使用 deploy 指令:

mvn deploy:deploy-file -DgroupId=<group-id> \	
  -DartifactId=<artifact-id> \	
  -Dversion=<version> \	
  -Dpackaging=<type-of-packaging> \	
  -Dfile=<path-to-file> \	
  -DrepositoryId=<id-to-map-on-server-section-of-settings.xml> \	
  -Durl=<url-of-the-repository-to-deploy>

最后说下我们为什么要学习maven,大概可以收获这些好处吧:

  • 提高自己的生产力

  • 更好的管理项目中的jar包

  • 自己开发的jar包可以共享给别人

  • 遇到jar包冲突问题可以不求人

  • 。。。

640?wx_fmt=png

关注「码洞」,老钱带你码出个未来

640?wx_fmt=png

关注阿里程序员「逅羿逐码」

出现 Try run Maven import with -U flag (force update snapshots) 的解决方法 Bug转换为中文,大致意思是:尝试使用-u来运行 Maven 导入。大致意思为:-e详细异常,-U强制更新。更换无法找到的maven库包。 阅读详情

相关推荐

spring-boot-jade:Jade 的 Spring Boot 自动配置

Jade4j 的 Spring Boot 自动配置支持 通过 Maven 使用 1. 在你的pom.xml添加以下快照依赖 < dependency> < groupId>com.github.instaweb</ groupId> < artifactId>spring-boot-jade</ artifactId> < version>0.9.0-SNAPSHOT</ version> </ dependency> 2. 确保将 sonatype 快照添加到您的存储库列表( pom.xml或~.m2/settings.xml ) < repositories> < repository> < id>sonatype-snapshots</ id> < url>https://oss.sonatype.org/content/repositor

IDEA:Cannot access public (xxx) in offline mode 错误

解决思路如下:1. maven环境变量是否配置正确;2. idea配置是否正确;3. 检查maven的仓库配置;4. 查看镜像路径是否变化或其他情况;

qq_24484317的博客 4252

spring-boot-maven-plugin-1.2.5.RELEASE.jar

java运行依赖jar包

maven找不到包_每个阿里程序员都必须搞懂的Maven基础知识

以前的日子以前我们写代码时,jar包都默认放在一个叫 /lib 的目录下,然后把该目录设置为classpath可以读取到的目录,如下图所示:某一天我们新加了一个功能,需要用到一个比较古老的 z.jar 包,这时我们到网上去各种搜索,由于比较罕见,最终在某个 xxx软件园 中找到了他。然后我们把 z.jar 包拷贝到 /lib 目录下:这时运行后报了一堆的错,原因是 z.jar 包有很多的...

weixin_39646405的博客 1180

AI市场风起云涌,ai浏览器是最佳的落地项目,现在ai市场的ai浏览器竞争加剧,得ai浏览器者得天下!

从场景覆盖度来看,AI 浏览器已突破 “网页浏览” 的传统边界,成为连接个人生活、工作、消费的 “超级入口”,这是其他 AI 应用难以比拟的落地优势。在个人生活场景,AI 浏览器可基于用户行为数据主动提供服务 —— 当用户浏览马拉松赛事信息时,浏览器能自动生成 “训练计划 + 装备推荐 + 能量补给方案”,并关联预订链接;在工作场景,Opera Neon 浏览器已实现 “网页内容提取 - 代码生成 - 报告撰写” 的全流程辅助,开发者可直接在浏览器内完成网站开发初稿;

zhang9880000的博客 1086

从空调温控到信号降噪:一阶RC低通滤波器在Arduino和STM32上的C语言实现指南

本文详细介绍了如何在Arduino和STM32平台上使用C语言实现一阶RC低通滤波器,涵盖从基础理论到实际应用的完整流程。通过具体代码示例和优化技巧,帮助开发者有效处理传感器噪声、信号平滑等问题,提升嵌入式系统的信号处理能力。

weixin_30565199的博客 502

Maven阿里云镜像地址

Maven阿里云最新镜像地址:https://maven.aliyun.com/repository/public

生命的痕迹 1万+

从零开始学版图(二)-----------差分放大电路

从零开始学版图

m0_56112720的博客 8565

如何给idea添加本地Maven仓库并修改idea默认maven仓库位置,配置阿里镜像

什么是Maven Maven的含义:Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。 Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。 在有多个开发团队环境的情况下,...

qq_34376868的博客 6561

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2202

YOLOv11在RK3588芯片上的NPU加速与INT8量化部署全面指南

RK3588 NPU适配YOLOv11的关键技术要点 摘要:本文详细分析了Rockchip RK3588 NPU的硬件架构特性及其对YOLOv11模型的适配优化方案。RK3588 NPU采用三核设计,具备6TOPS算力,包含192个MAC单元和128KB专用SRAM。YOLOv11作为最新目标检测模型,其CSPNet-v5骨干网络、PANet特征金字塔和SiLU激活函数需要特殊适配处理。文章系统介绍了从PyTorch模型导出、ONNX优化到RKNN模型转换的完整流程,重点阐述了NPU不支持的算子处理方案和量

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1361

IDEA配置Maven教程(超详细版~)

本文介绍如何下载安装Maven,配置maven全局变量,以及在idea中配置maven等

qq_40187702的博客 7万+

105、LLC谐振变换器的LTspice仿真建模

文章摘要:本文分享了LLC谐振变换器在LTspice中的仿真建模经验。作者从实际调试中炸管的教训出发,指出数学计算无法捕捉瞬态问题,必须通过仿真验证。详细介绍了半桥LLC主电路搭建、理想元件选择、开环增益扫频、闭环控制实现等关键步骤,重点讲解了启动过程、ZVS验证和短路保护等高风险工况的仿真技巧。文章提供了实用参数设置建议和LTspice代码片段,强调先开环后闭环的调试顺序,并提醒仿真结果需保留20%设计裕量。最后总结了谐振电流波形观察、死区时间优化等经验性建议。

Jack010169的博客 229

怎么将自己的Maven项目上传到Maven中央仓库/Maven阿里云云效仓库

账号密码同第一步注册的issues.sonatype.org按照下图步骤一步一步操作在点击Close 验证的时候可能会出现错误,导致不能执行下一步,这个时候需要调整项目pom配置,调整好后,重新发布,再次验证不报错即可。

luckywuxn的博客 1868

风控域——决策引擎系统设计

本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具,可自动化、数据驱动地辅助或替代人工决策,广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能,包括自动化决策、动态规则管理、实时处理和模型集成,以及系统组成,涵盖数据输入层、规则引擎和模型服务层。此外,还探讨了决策引擎的典型应用场景、技术架构、组件设计,以及风控决策引擎系统的技术方案、设计难点和重点。

庄小焱 3321

【华为OD技术面试手撕真题】25、验证IP地址 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

验证IP地址 华为od机试真题,华为OD技术二面,华为od机考,华为od手撕真题,华为od技术二面,华为od机试,华为OD机试的高频手撕代码题,华为od八股文

KJ.JK 4043

eclipse如何配置Maven

虽然现在Java的主流编译器是IDEA,但是IDEA是一款收费软件,而且最近看到IDEA发出了涨价的公告,对大多数小伙伴来说也挺贵的。有些小伙伴觉得网上有好多 ”破姐“ 的方法,但是终究不是那么光明正大嘛。而且作为程序员,我们也是不希望自己的作品被 ”破姐“ 使用。再加上一些企业也是不能随便使用经过操作的IDEA,所以仍然有一部分用户在用着 eclipse,而Maven作为一款强大的项目管理工具,也有不少在用,所以今天出一个关于在eclipse中配置Maven的教程...

小六的代码修炼之路 3万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

国内maven库镜像(阿里云)

作为一个初级程序员,在学习spring boot的过程中竟然找不到spring boot的下载方式。况且spring boot推荐使用maven配置,我没有这样的仓库啊   你没看错,是国内最快的maven镜像,感觉像是开飞机一样,那就是阿里云maven镜像(人家财大气粗,确实豪,速度自然非常快)。   &lt;repositories&gt;             &...

星星知我心的博客 416

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Maven(五)之Maven配置阿里云镜像飞快下jar包

用过Maven的人都知道Maven对于依赖的管理让我们程序员从此远离了自己去在项目中把需要的jar包导入到项目中,但是因为中央仓库是在国外的,所以在我们从中央仓库下载依赖的时候, 我们发现下载速度真的是无语了,所以我们用什么方法来解决这个问题呢?答案是:配置阿里云国内镜像 一、什么是镜像 maven默认会从中央仓库下载jar包,这个仓库在国外,而且全世界的人都会从这里下载,所以下载...

a878787877的专栏 195

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【黑马程序员Maven基础笔记】

B站黑马程序员Maven学习笔记

m0_54276039的博客 7774

Java程序员如何能进入阿里、大众点评这样的大型互联网公司?

Java程序员如何能进入阿里、大众点评这样的大型互联网公司? 此面试题是我分享给大家,不管去不去还是能不能进去,知道点还是好的,说不定哪天就用上了。 PS:列这么多,你想扼杀竞争对手的吗? 哈哈哈哈哈哈 电话面试主要考察3块内容: 1、Java的相关基础知识,开源框架的原理,JVM,多线程,高并发,中间件等; 2、之前项目经历,运用的技术,遇到的问题,如何

huangshulang1234的博客 519

Maven从入门到精通,小白也能快速上手

我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复【资料】,即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板。 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录Maven 简介一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 .

陈皮的JavaLib 2784

Maven安装配置及在idea中配置

目录 一、Maven是什么 二、Maven安装及配置 1. Maven本地安装 2. Maven环境变量的配置 3. Maven 配置repository 三、idea中创建meven webapp及配置 1. 配置 settings 2. 创建 meven webapp 一、Maven是什么 1. Maven是Apache下的一个纯java开发的开源项目,它是一个项目管理...

iqqcode 6万+

【Maven运行报错及解决方案,一个Java程序员的阿里面试心得

知道了你的JDK版本之后,对于解决有两种方法: 解决方案一:修改pom.xml文件配置 ======================= 这种方法需要修改当前运行工程项目的pom.xml配置文件中的内容,在其中添加如下代码。作用是告诉当前工程使用哪个版本的JDK运行。如我的JDK版本是10.0.1,所以版本就填10,但是这种方法使用之后只能对当前这个项目有效,对于其他使用默认JDK的工程就不管用了! <properties> <project.build.sourceE.

m0_61452556的博客 740

Maven详解

Maven简介 什么是Maven Maven在美国是一个口语化的词汇,代表专家、内行的意思。 一个对maven比较正式的定义是这样讲的 Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段中插件(plugin)目标的逻辑 。 maven能解决什么问题 可以用更通俗的方式来说

m0_48811221的博客 3443
上一篇: 网易工程师 Ruheng 一文教你轻松学会 Git
下一篇: LevelDB 入门 —— 全面了解 LevelDB 的功能特性
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值