`
InvocationHandler
  • 浏览: 36394 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

初学Maven笔记

阅读更多
配置代理:
1.确认自己无法直接访问公共的Maven中央仓库:ping repo1.maven.org
2.检查代理服务器是否畅通:telnet xxx.xxx.xxx.xxx xxxx如果连接正确刚ctrl+],然后按q,退出。
然后在settings.xml中配置如下:
<settings>
	...
	<proxies>
		<proxy>
			<id>my_proxy</id>
			<active>true</active>
			<protocol></protocol>
			<host></host>
			<port></port>
			<username></username>
			<password></password>
			<nonProxyHosts></nonProxyHosts><!--过滤掉不需要代理的网址-->
		</proxy>
	</proxies>
	...
</settings>


配置maven-compile-plugin支持java 5
<project>
	...
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compile-plugin</artifactId>
				<configuration>
					<scope>1.5</scope>
					<target>1.5</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	...
</project>


当代码中有main方法时,默认的打包生成的jar无法直接运行,因为带有main方法的类信息不会加到mainfest中(jar文件中META-INF/MAINFEST.MF文件,将无法看到Main-Class一行)。为了生成可执行的jar文件,要配置maven-shade-plugin:
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-shade-plugin</artifactId>
	<version>1.2.1</version>
	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>shade</goal>
			</goals>
			<configuration>
				<transformers>
					<transformer implementation="org.apache.maven.plugins.shade.resource.MainfestResourceTransformer">
						<mainClass></mainClass>
					</transformer>
				</transformers>
			</configuration>
		</execution>
	</executions>
</plugin>


Maven有三种classpath(compile,test,runtime)

Maven有以下几种依赖范围来控制依赖与这三种classpath的关系:
Compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-core,在编译、测试和运行的时候都要使用该依赖。
Test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。
Provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复的引入一遍。
Runtime:运行时依赖范围 。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码主编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
System:
系统依赖范围。该依赖与3种classpath的关系 ,和Proveided依赖范围 完全一致。但是,使用System范围 的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量如:
<dependency>
	<groupId>javax.sql</groupId>
	<artifactId>jdbc-stdext</artifactId>
	<scope>system</scope>
	<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

Import(Maven 2.0.9及以上):导入依赖范围。该依赖范围不会对3种classpath产生实际的影响。

传递性依赖和依赖范围:
假设A依赖于B,B依赖于C,我们说A与B是第一直接依赖,B与C是第二直接依赖,A与C是传递性依赖。
传递性依赖范围:
  • 1.当第二直接依赖的范围是compile时,传递性依赖的范围与第一直接依赖的范围一致;
  • 2.当第二直接依赖的范围是test时,依赖不会得以传递;
  • 3.当第二直接依赖的范围是provided时,只传递第一直接依赖也是provided的依赖,且传递性依赖的范围同样是provided


依赖调解(Dependency Mediation)
依赖调解的两项原则:
  • 1.路径最近者优先;
  • 2.最先声明者优先。


排除依赖:

由于某些原因,想替换某个传递性依赖或者去掉一些不稳定性的依赖时就要使用排除依赖。
<project>
	<modelVersion></modelVersion>
	<groupId></groupId>
	<artifactId></artifactId>
	<version></version>
	<dependencies>
		<dependency>
			<groupId></groupId>
			<artifactId></artifactId>
			<version></version>
			<exclusions>
				<exclusion>
					<groupId></groupId>
					<artifactId></artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
				<groupId></groupId>
				<artifactId></artifactId>
				<version></version>
		</dependency>
	</dependencies>
</project>


归类依赖:

当依赖来自同一项目的不同模块时,这些依赖的版本都是相同的,而且可以预见,如果将来需要升级,这些依赖的版本会一起升级那么就应该使用归类依赖来减少错误,方便管理。用法如下:
<project>
	<modelVersion></modelVersion>
	<groupId></groupId>
	<artifactId></artifactId>
	<version></version>
	
	<properties>
		<springframework.version>2.5.6</springframework.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${springframework.version}</version>
		</dependency>
		<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-beans</artifactId>
				<version>${springframework.version}</version>
		</dependency>
		...
	</dependencies>
</project>


优化依赖:

在软件开发过程中,程序员会通过重构等方式不断优化自己的代码,使其变得更简洁、更灵活。同理,程序员也应该能够对Maven项目的依赖了然于胸,并对其进行优化,如去除多余的依赖,显式地声明某些必要的依赖。
Maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到的那些依赖被称为已解析依赖(Resolved Dependency)。可以运行如下命令查看当前项目的已解析依赖:
mvn dependency:list

在此基础上,还能进一步了解已解析依赖的信息。将直接在当前项目POM声明的依赖定义为顶层依赖,而这些顶层依赖的依赖则定义为第二层依赖,以此类推。当这些依赖经Maven解析后,就会构成一个依赖树,通过为样依赖树能很清楚地看到某个依赖是通过 哪条路径引入的。查看当前项目的依赖树命令为:
mvn dependency:tree

在此基础上,还有dependency:analyze工具可以帮助分析当前项目的依赖。
显示结果中重要的两个部分:
  • 1.Used undeclared dependencies意指项目中使用但是没有显式声明的依赖。
  • 2.Used decalared dependencies意指项目是未使用的但是显式声明的依赖。这里列出的要小心分析,因为dependency:analyze只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它发现不了。
0
1
分享到:
评论
1 楼 duo935658701 2014-02-23  
配置maven-compile-plugin支持java 5 对应代码的第7行的compiler中的r少了!

相关推荐

    Maven笔记与资料.zip

    观看这个视频将有助于加深对Maven的理解,特别是对于初学者,通过视频形式的学习往往更加直观和生动。 ** Maven的常用命令 ** - `mvn clean` 清理项目,删除target目录。 - `mvn compile` 编译源代码。 - `mvn ...

    maven笔记+教案

    提供的"Maven教案.docx"文档可能包含详细的Maven教程,涵盖了Maven的基本概念、使用方法、配置技巧以及解决常见问题等内容,适合初学者和进阶者参考学习。通过深入阅读这份教案,读者可以全面了解和掌握Maven的各个...

    Maven 教程:基础篇-尚硅谷学习笔记 2022年

    **Maven教程:基础篇——尚硅谷学习笔记 2022年** Maven是一个强大的Java项目管理和构建工具,由Apache软件基金会开发。它通过提供一个标准的项目对象模型(Project Object Model,POM)来简化项目的构建过程,并...

    Maven初学笔记

    ### Maven初学笔记 #### Maven概述 **Apache Maven** 是一款功能强大的软件项目管理和综合工具。它基于项目对象模型(Project Object Model, POM)的概念,能够从一个中心信息源管理项目的构建、报告以及文档。这...

    Maven开发者笔记

    总之,《Maven开发者笔记》是一本全面而深入的Maven教程,无论你是初学者还是经验丰富的开发者,都能从中受益,提升你的项目构建和管理能力。通过阅读这本书,你可以更好地掌握Maven的精髓,将它应用于实际开发工作...

    培训机构传出的maven学习笔记

    **正文** Maven是Java开发领域中不可或缺...通过这份学习笔记,初学者将能够快速上手Maven,熟练掌握项目构建流程,提高开发效率。而经验丰富的开发者也能从中学习到新的技巧和最佳实践,提升自身在项目管理中的能力。

    maven 入门笔记配套示例代码

    本压缩包包含了"Maven入门笔记"的配套示例代码,主要帮助初学者理解Maven的基本用法和概念。 在"Maven入门笔记"中,你可能会学到以下关键知识点: 1. **Maven架构**:Maven基于项目对象模型(Project Object Model...

    maven使用笔记

    这个笔记将帮助初学者快速掌握 Maven 的基本用法和核心概念。 1. Maven 简介 Maven 减轻了开发人员在构建过程中的负担,它统一了项目的构建过程,使得不同项目可以使用相同的方式进行构建。Maven 提供了一种基于...

    maven学习笔记

    ### Maven 学习笔记 #### 一、Maven 概述 Maven 是一款非常流行的自动化构建工具,它主要用于 Java 项目的构建与依赖管理。通过 Maven,开发者可以轻松地完成项目的清理、编译、测试、打包、发布等一系列操作。...

    201205_Maven学习笔记1.rar

    【标题】:“201205_Maven学习笔记1.rar”揭示了关于Maven的深入学习内容,这个压缩包包含了一系列文档,旨在帮助开发者更好地理解和应用Maven这一强大的Java项目管理和构建工具。 【描述】:尽管描述部分是空的,...

    Maven学习笔记

    ### Maven学习笔记 #### Maven简介 Maven是一个项目管理和理解工具。通过Maven,开发者能够管理项目的构建、依赖关系以及文档等。Maven的核心特点包括自动化构建过程、依赖管理和项目信息管理。 #### Maven的安装...

    关于Maven学习的笔记

    ### Maven学习笔记知识点详解 #### 一、Apache Maven简介 Maven是一种自动化构建工具,用于管理Java项目的构建、依赖管理和项目信息。它提供了一种项目对象模型(Project Object Model,简称POM),一种标准构建...

    maven学习资源整理

    本资源包是为初学者和有经验的开发者准备的一系列Maven学习资料,旨在帮助你更好地理解和掌握Maven的核心功能和最佳实践。 **官方文档:apache-maven** Apache Maven的官方文档是学习Maven的首选资源。这个文档...

    Maven+Svn安装笔记.rar

    Maven 和 SVN 是软件开发中常用的两个工具,它们...这些笔记对于初学者来说是一份宝贵的资源,帮助他们快速理解和掌握Maven和SVN的安装与基本使用。通过学习这些内容,开发者可以更有效地进行协作开发,提高工作效率。

    Maven实战笔记

    **Maven实战笔记** 在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程。Maven通过一个统一的项目...Maven3实战笔记将详细讲解这些内容,是初学者掌握Maven的宝贵资料。

    Maven入门实战笔记02-基础(2)

    【标题】"Maven入门实战笔记02-基础(2)" 涉及的主要知识点是Maven的基础使用,包括项目的创建、配置文件的理解以及依赖管理等。Maven是一款强大的Java项目管理和集成工具,它帮助开发者统一构建过程,管理项目的依赖...

    maven本地仓库

    初学者在学习Maven时,记录笔记是很有帮助的。这些笔记可能包括对Maven生命周期的理解、各种插件的使用、以及如何解决依赖冲突等问题。例如,了解`clean`、`compile`、`test`、`package`等阶段可以帮助理解Maven如何...

    eclipse笔记_itselfizg_配置_Eclipse开发工具_maven_Eclipse_

    【Eclipse开发工具配置与Maven集成】 Eclipse是一款广泛使用的开源Java集成开发环境(IDE),为开发者提供了强大的代码编辑、...在"eclipse笔记"中,你可能找到了作者的经验分享,这对于初学者来说是非常宝贵的资源。

Global site tag (gtag.js) - Google Analytics