上面是指定端口運行程序的,也可以先指定好,直接在上面的地方寫jettty:run 當然,如果你是在控制台運行且安裝了maven,直接可以進入項目的文件中:mvn jetty:run
就是說,在控制台運行只要加上一個mvn就ok了
你先需要理解maven的生命周期與插件目標這兩個概念。 拿Maven clean來說吧。生命周期為clean.插件目標為maven-clean-plugin:clean。 Maven build是這個插件讓你自己去配置執行目標的。 Maven clean 清除上一次Maven執行的結果 Maven generate-sources會根據pom配置去生成源代碼格式的包
Maven install將項目輸出構件部署到本地倉庫
maven最主要的作用有兩個方面,一個是對jar包的依賴解決功能,自己管理jar包,另一個功能就是項目的構建,打包部署。現在我覺得最重要的還是maven的生命周期和插件機制,下面就來總結一下吧。
mvn install 是將你打好的jar包安裝到你的本地庫中,一般沒有設置過是在 用戶目錄下的 .m2\下面。 mvn package 只是將你的代碼打包到輸出目錄,一般的是 target下面。
eclipse插件,m2eclipse
1.maven install相當於maven原生的命令: mvn install
2.aven build是 m2eclipse這個插件自己創造的概念,需要你來配置到底需要執行什么命令,如下圖中的goals輸入的就是你想執行的命令:
Goals就是mvn的意思,所以中間不需要加mvn了
Eclipse中maven常用的命令
點擊Run As就可以發現幾個Maven的命令:
Maven Build:
這個命令用於編譯Maven工程,執行命令后會在target文件夾中的classes中生成對應的class文件。
Maven Clean:
刪除target文件夾,即刪除生成的package包以及class等文件。
Maven Test:
先自動進行編譯,在運行所有的測試用例。
Maven install:
發布生成對應的package包。
注意:
留意上面的命令的作用,build和test都會生成相應的class文件。也就是說,當你新建一個maven工程,或者clean一個maven工程后,如果沒有使用這兩個命令,直接針對類進行測試,會跑出java.class.notfound的錯誤。因為此時還沒有編譯生成class文件。
只有使用了上面的兩個命令后,才能針對某個類進行單元測試。
什么是maven?
Maven是一個用於項目構建的工具,通過它便捷的管理項目的生命周期。即項目的jar包依賴,開發,測試,發布打包。
下面我自己總結一下它的幾個特點,看了這些特點,也許對maven有更多的了解。
1 jar包依賴
這個也許會maven最突出的特點了使用maven不需要上網單獨下載jar包,只需要在配置文件pom.xml中配置jar包的依賴關系,就可以自動的下載jar包到我們的項目中。這樣,別人開發或者使用這個工程時,不需要來回的拷貝jar包,只需要復制這個pom.xml就可以自動的下載這些jar包。
而且,我們自己下載jar包,還有可能造成版本的不一致,這樣在協同開發的過程中就有可能造成代碼運行的不一致。通過使用maven精確的匹配jar包,就不會出現這種問題了。
2 項目坐標
Maven通過特定的標識來定義項目名稱,這樣既可以唯一的匹配其他的jar包,也可以通過發布,使別人能使用自己的發布產品。這個標識就被叫做坐標,長的其實很普通,就是簡單的xml而已:
1 <groupId>com.test</groupId> 2 <artifactId>maventest</artifactId> 3 <version>0.0.1-SNAPSHOT</version> 4 <packaging>jar</packaging> 5 6 <name>maventest</name> 7 <url>http://maven.apache.org</url>
groupId:所述的項目名稱,由於有的項目並不是一個jar包構成的,而是由很多的jar包組成的。因此這個groupId就是整個項目的名稱。
artifactId:包的名稱。
version:版本號。
packaging:包的類型,一般都是jar,也可以是war之類的。如果不填,默認就是jar。
name和url,一個是名稱,一個是maven的地址。主要就是上面的幾個參數。
當想要依賴什么jar的時候就可以通過下面的方式依賴:
1 <dependencies> 2 <dependency> 3 <groupId>junit</groupId> 4 <artifactId>junit</artifactId> 5 <version>3.8.1</version> 6 <scope>test</scope> 7 </dependency> 8 </dependencies>
各個屬性的內容基本上都是一樣的。
這里要注意的是jar包的命名規則:
artifactId-version[-classifier].packaging
比如上面的pom.xml生成的jar包名字就是:maventest-0.0.1-SNAPSHOT.jar。
這里的classifier是可選的,但是有的項目可能還需要導出附屬的一些文件,如javadoc,source等等,那么這個地方就需要配置一個字符串。一般都是JDKXXX之類的。
創建project
先去官方網站下載一個最新版本http://maven.apache.org/download.cgi. 下載后解壓,使用之前最好先將maven的bin目錄設置到path環境變量里面。
maven無非也就是用來build一個project的,直接先上一個例子,在命令行下輸入下面的命令:
mvn archetype:generate DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=myapp
mvn就是maven的命令行程序,archetype:generate中的archetype是plugin的名字,generate是goal的名字,命令行后面的是一些參數。關於archetype和goal以及后面的參數,后面再細說。
如果是第一次運行,這個過程會有點慢,maven需要下載一些依賴項,中間如果有輸入提示信息,直接回車使用默認值就可以了。這條命令執行完后,會在你的當前目錄下生成一個名為myapp的目錄:
注意這個目錄結構,src/main/java 和 src/test/java 是不能改動,不然maven會無法找到源文件。下面是maven一個標准的目錄結構:
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/assembly | Assembly descriptors |
src/main/config | Configuration files |
src/main/scripts | Application/Library scripts |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/site | Site |
另外maven還生成了一個重要的文件pom.xml,maven就是通過這個文件來來管理整個project,可以理解位類似於eclipse的.project文件。默認生成的pom.xml文件的內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/* 1-1 */
<
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
>com.mycompany.app</
groupId
>
<
artifactId
>my-app</
artifactId
>
<
version
>1.1.0.1</
version
>
<
packaging
>jar</
packaging
>
<
name
>myapp</
name
>
<
properties
>
<
project.build.sourceEncoding
>UTF-8</
project.build.sourceEncoding
>
</
properties
>
<
dependencies
>
<
dependency
>
<
groupId
>junit</
groupId
>
<
artifactId
>junit</
artifactId
>
<
version
>3.8.1</
version
>
<
scope
>test</
scope
>
</
dependency
>
</
dependencies
>
</
project
>
|
解釋一下這個xml文件的內容:
- modelVersion: 這個XML文件所使用的POM格式的版本
- groupId: 相當於這個project的所有者或者機構的一個標識,一般是com.company.xxx這種格式
- artifactId: 這個project最后所生成的文檔(jar、war)的名字,比如對於junit這個開源的project,它的artifactId就是junit
- packaging: 這個project的打包的類型,一般是war、jar等值
- version: project的版本
- name: project的名字,生成文檔等內容的時候會用的這個名字
這個project創建好后和普通的project沒有什么不同,我們直接往里面放源代碼進行開發就可以了,如果有目錄想修改的也完全可以。
POM & archetype
archetype就是一個project的模板,上面我們生成的project就是用默認的archetype生成的。如果使用不同的archetype,生成的project結構會有所不同。 一個archetype指明了
- 1) 項目的目錄結構以及什么目錄是放source code,哪些是放test source code,哪些目錄是放resource的。
- 2) 一個默認的pom.xml文件,這個默認的pom.xml文件中的groupId,artifactId,version用占位符表示,在創建project的時候通過參數傳進來。
pom.xml文件的POM全稱是Project Object Model,這個文件對於maven的使用者來說是一個和maven交互的渠道,pom.xml包含了一個maven project的配置,一個project該如何編譯打包,project有哪些依賴項等等。
仔細看一下我們前面創建project的命令:mvn archetype:generate DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=myapp
- 1) archetype:generate, 這是一個maven的plugin,用來從一個archetype創建一個project,關於plugin后面再說。
- 2) DarchetypeGroupId,這個就是指的archetype的groupid,也就是說是用的哪個archetype,或者說用哪個項目模板。
- 3) 后面的兩個參數,用來放大pom.xml文件里面,作為當前創建的project的描述信息。
Project創建好了,看如何去編譯,直接進入的project的目錄,在命令行下:
mvn compile
編譯完后maven會創建一個target目錄去保存編譯結果。 我們需要編譯成一個什么樣的內容,以及要輸出到什么地方等等,都是可以在pom.xml文件里面配置的,但是因為我們目前並沒有指定這些內容,所以maven會使用默認值。
我們還可以用maven執行test:
mvn test
第一次執行時,maven會去下載一些依賴項。另外要注意的時,如果我們更改了默認的目錄結構,maven會因為找bu到test而無法去執行test。如果只需要編譯test可以執行:
mvn test-compile
要把項目打包,執行:
mvn package
mvn會根據pom.xml里面的packaging選項打包成相應的文件。
repository & dependency
maven里面有一個repository的概念,當我們的項目依賴於某個jar時,maven會去repository里面去找。repository分兩種,一種是遠程的,一種是本地的。如果有幾個project都用到junit,我們可以把junit放在repository里面,幾個project可以公用,節約存儲空間而且方便管理,這個repository的位置可以在pom.xml里面設置。
本地的默認的路徑是安裝用戶的目錄下的 .m2\repository 文件夾。如果一個依賴項在本地的repository里面沒有,那么maven會去他自己的遠程的repositoryhttp://repo.maven.apache.org/maven2 去下載后放到本地的repository里面。
也就是說,我們如果我們的project需要要引用一個依賴項,我們只需要在pom.xml文件中進行配置,maven會自動幫我們去引用。 我們之前的創建project里面需要寫單元測試,引用到了junit,看pom中的配置:
1
2
3
4
5
6
7
8
|
<
dependencies
>
<
dependency
>
<
groupId
>junit</
groupId
>
<
artifactId
>junit</
artifactId
>
<
version
>3.8.1</
version
>
<
scope
>test</
scope
>
</
dependency
>
</
dependencies
>
|
每一個需要為每一個 dependency 指明groupId,artifactId,version。scope很簡單,意思是說我們需要怎么引用,比如我們上面的例子里面設置的是test,意思是說只在test里面引用junit。 但是我們如何知道groupId,artifactId和version呢? 比如我現在想引用log4j,這個幾個值怎么填? 可以去http://mirrors.ibiblio.org/maven2/ 上去查找。比如log4j,我們就在上面這個地址加上log4j,也就是http://mirrors.ibiblio.org/maven2/junit/。進去后會有一個maven-metadata.xml,打開就可以知道這些值了然后添加這個dependency了。
如果要把一個project安裝到本地的repository里面,可以執行下面的命令:
mvn install
到這里就說完了創建,編譯,測試,打包以及安裝,大部分的項目也就是做這些事情。
再介紹幾個其它命令:
- mvn site : 為你的project創建一個站點
- mvn clean: 清除target目錄下的所有文件
- mvn eclipse:eclipse :為project生成eclipse的工程文件和classpath文件
build lifecycle & build phase & goal
maven有一套build的生命周期,是按照一套順序走下來的,這一套順序就叫一個生命周期(lifecycle)。maven內置三種生命周期:default, clean 和 site。一個生命周期分為多個build phase,下面是default生命周期全部的build phase:
- validate:validate the project is correct and all necessary information is available.
- initialize:initialize build state, e.g. set properties or create directories.
- generate-sources:generate any source code for inclusion in compilation.
- process-sources:process the source code, for example to filter any values.
- generate-resources:generate resources for inclusion in the package.
- process-resources:copy and process the resources into the destination directory, ready for packaging.
- compile:compile the source code of the project.
- process-classes:post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
- generate-test-sources:generate any test source code for inclusion in compilation.
- process-test-sources:process the test source code, for example to filter any values.
- generate-test-resources:create resources for testing.
- process-test-resources:copy and process the resources into the test destination directory.
- test-compile:compile the test source code into the test destination directory
- process-test-classes:post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
- test:run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
- prepare-package:perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
- package:take the compiled code and package it in its distributable format, such as a JAR.
- pre-integration-test:perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
- integration-test:process and deploy the package if necessary into an environment where integration tests can be run.
- post-integration-test:perform actions required after integration tests have been executed. This may including cleaning up the environment.
- verify:run any checks to verify the package is valid and meets quality criteria.
- install:install the package into the local repository, for use as a dependency in other projects locally.
- deploy:done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
這些build phase是按照順序執行的,如果執行后面的build phase,前面的build phase 也會被執行。例如如果執行:
mvn deploy
前面的install、verify一直到validate這些build phase都會執行。
每一個build phase是由goal組成的,一個goal其實就是一個任務,一個goal可以關聯到一個build phase也可以不關聯到任何build phase 。 不關聯到任何phase的goal是可以獨立執行的,例如:
mvn clean dependency:copy-dependencies package
上面的命令會導致先執行clean這個phase,然后拷貝依賴項,最后打包。注意,這里clean這個goal是clean這個lifecycle里面的一個goal,所以可以看到不同lifecycle的build phase和goal是可以混合在一起執行的。 如果一個goal被綁定到多個phase上,那么goal就會被執行多次。
phase的順序是已經固定的,如果一個phase沒有綁定到任何goal,那么phase就不會被執行。 一個goal可以通過兩種方式綁定到一個phase,一個是指定packaging,另一個就是plugin。
packaging&plugin
plugin就是用來向maven提供goal的。一個plugin里面可以有多個goal,這就是為什么我們在指明goal時,前面會用一個冒號與plugin的名字。
一個plugin自己可以指定自己的goal綁定到哪個lifecycle的哪一個Phase上,另外也可以配置一個goal綁定到哪個phase上。可以在pom.xml里面配置。 看兩個配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<
plugin
>
<
groupId
>org.codehaus.modello</
groupId
>
<
artifactId
>modello-maven-plugin</
artifactId
>
<
version
>1.4</
version
>
<
executions
>
<
execution
>
<
configuration
>
<
models
>
<
model
>src/main/mdo/maven.mdo</
model
>
</
models
>
<
version
>4.0.0</
version
>
</
configuration
>
<
goals
>
<
goal
>java</
goal
>
</
goals
>
</
execution
>
</
executions
>
</
plugin
>
|
這個就在當前的lifecycle里面添加了一個名字叫java的goal,這goal會根據自己的配置去綁定到一個phase,在phase執行的時候這個goal會執行。並且在這個配置里面,可以指定多個execution來讓這個goal執行多次。
看另一個示例配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<
plugin
>
<
groupId
>com.mycompany.example</
groupId
>
<
artifactId
>display-maven-plugin</
artifactId
>
<
version
>1.0</
version
>
<
executions
>
<
execution
>
<
phase
>process-test-resources</
phase
>
<
goals
>
<
goal
>time</
goal
>
</
goals
>
</
execution
>
</
executions
>
</
plugin
>
|
這個名為time的goal把自己綁定到了process-test-resource這個phase上。
在默認情況下,並不是所有的phase都綁定了goal,比如clean這個lifecycle是有三個phase的,但是只有其中的一個名為clean的phase默認綁定了一個clean:clean goal,其它兩個phase默認沒有綁定任何goal。
之前已經提到過packaging,在pom.xml可以指定packaging,每種packaging都設定了一組phase和goal之間的綁定關系。在default lifecycle下,當packaging為 ejb/ejb3/jar/par/rar/war 其中之一的值的時候,只有以下的phase綁定了goal,具體如下:
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | jar:jar |
install | install:install |
deploy | deploy:deploy |
總結
首先搞清楚maven的project的目錄結構,然后理解maven的lifecycle,lifecycle是由build phase組成,每一個build phase會綁定到goal。goal是由plugin提供的。 每一種packaging的值都表明了一定的phase和goal之間的綁定關系。
另外一個很重要的就是dependency,我們要在項目中引用一個依賴,只需要在pom.xml指定依賴的名字和版本,maven會自動去遠程的repository下載,然后放到本地的repository里面,這樣以后所有的project都可以共用
Maven常用命令:
1. 創建Maven的普通java項目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName
2. 創建Maven的Web項目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
3. 編譯源代碼: mvn compile
4. 編譯測試代碼:mvn test-compile
5. 運行測試:mvn test
6. 產生site:mvn site
7. 打包:mvn package
8. 在本地Repository中安裝jar:mvn install
9. 清除產生的項目:mvn clean
10. 生成eclipse項目:mvn eclipse:eclipse
11. 生成idea項目:mvn idea:idea
12. 組合使用goal命令,如只打包不測試:mvn -Dtest package
13. 編譯測試的內容:mvn test-compile
14. 只打jar包: mvn jar:jar
15. 只測試而不編譯,也不測試編譯:mvn test -skipping compile -skipping test-compile
( -skipping 的靈活運用,當然也可以用於其他組合命令)
16. 清除eclipse的一些系統設置:mvn eclipse:clean
ps:
一般使用情況是這樣,首先通過cvs或svn下載代碼到本機,然后執行mvn eclipse:eclipse生成ecllipse項目文件,然后導入到eclipse就行了;修改代碼后執行mvn compile或mvn test檢驗,也可以下載eclipse的maven插件。
mvn -version/-v 顯示版本信息
mvn archetype:generate 創建mvn項目
mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app 創建mvn項目
mvn package 生成target目錄,編譯、測試代碼,生成測試報告,生成jar/war文件
mvn jetty:run 運行項目於jetty上,
mvn compile 編譯
mvn test 編譯並測試
mvn clean 清空生成的文件
mvn site 生成項目相關信息的網站
mvn -Dwtpversion=1.0 eclipse:eclipse 生成Wtp插件的Web項目
mvn -Dwtpversion=1.0 eclipse:clean 清除Eclipse項目的配置信息(Web項目)
mvn eclipse:eclipse 將項目轉化為Eclipse項目
在應用程序用使用多個存儲庫
<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>
mvn deploy:deploy-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar -DrepositoryId=maven-repository-inner -Durl=ftp://xxxxxxx/opt/maven/repository/
發布第三方Jar到本地庫中:
mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar
-DdownloadSources=true
-DdownloadJavadocs=true
mvn -e 顯示詳細錯誤 信息.
mvn validate 驗證工程是否正確,所有需要的資源是否可用。
mvn test-compile 編譯項目測試代碼。 。
mvn integration-test 在集成測試可以運行的環境中處理和發布包。
mvn verify 運行任何檢查,驗證包是否有效且達到質量標准。
mvn generate-sources 產生應用需要的任何額外的源代碼,如xdoclet。
常用命令:
mvn -v 顯示版本
mvn help:describe -Dplugin=help 使用 help 插件的 describe 目標來輸出 Maven Help 插件的信息。
mvn help:describe -Dplugin=help -Dfull 使用Help 插件輸出完整的帶有參數的目標列
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull 獲取單個目標的信息,設置 mojo 參數和 plugin 參數。此命令列出了Compiler 插件的compile 目標的所有信息
mvn help:describe -Dplugin=exec -Dfull 列出所有 Maven Exec 插件可用的目標
mvn help:effective-pom 看這個“有效的 (effective)”POM,它暴露了 Maven的默認設置
mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook 創建Maven的普通java項目,在命令行使用Maven Archetype 插件
mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main Exec 插件讓我們能夠在不往 classpath 載入適當的依賴的情況下,運行這個程序
mvn dependency:resolve 打印出已解決依賴的列表
mvn dependency:tree 打印整個依賴樹
mvn install -X 想要查看完整的依賴蹤跡,包含那些因為沖突或者其它原因而被拒絕引入的構件,打開 Maven 的調試標記運行
mvn install -Dmaven.test.skip=true 給任何目標添加maven.test.skip 屬性就能跳過測試
mvn install assembly:assembly 構建裝配Maven Assembly 插件是一個用來創建你應用程序特有分發包的插件
mvn jetty:run 調用 Jetty 插件的 Run 目標在 Jetty Servlet 容器中啟動 web 應用
mvn compile 編譯你的項目
mvn clean install 刪除再編譯
mvn hibernate3:hbm2ddl 使用 Hibernate3 插件構造數據庫
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
課程目標:了解什么是jar包,使用maven完成一個下載圖片的需求
maven下載安裝配置(*)
環境變量配置
下載maven:http://maven.apache.org/download.cgi
maven_home
path添加
驗證結果
mvn -version
maven倉庫
遠程
私服
搭建私服
一般在企業內部局域網中使用
中央倉庫
maven內置遠程倉庫地址
maven-model-builder-3.5.4\org\apache\maven\model\pom-4.0.0.xml
找jar包
本地->私服->中央倉庫
找好了jar包,下載的jar放在哪
統統在本地倉庫
本地maven庫
修改配置文件(可選)
不修改放在默認的庫 .m2\repository
本地倉庫
mvn archetype:generate
eclipse配置maven
在線安裝:eclipse安裝maven插件;http://m2eclipse.sonatype.org/sites/m2e
添加maven安裝路徑
添加maven倉庫
配置maven倉庫
maven常用命令(*)
mvn archetype:generate
利用默認模板創建mvn項目
mvn compile
編譯Java文件並且放到target下
mvn clean
清除target下所有文件
mvn test
運行測試代碼
mvn package
打包命令,團隊協做共享
mvn install
把打的包放在本地倉庫
maven三套生命周期(了解)
Maven有三套相互獨立的生命周期,請注意這里說的是“三套”,而且“相互獨立”,初學者容易將Maven的生命周期看成一個整體,其實不然。這三套生命周期分別是:
Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle 生成項目報告,站點,發布站點。
每個生命周期會執行不止一個命令
maven jar依賴范圍(了解)
1. compile 默認的范圍,編譯測試運行都有效。
2. provided 編譯和測試時有效,最后是在運行的時候不會被加入。官方舉了一個例子。比如在JavaEE web項目中我們需要使用servlet的API,但是呢Tomcat中已經提供這個jar,我們在編譯和測試的時候需要使用這個api,但是部署到tomcat的時候,如果還加入servlet構建就會產生沖突,這個時候就可以使用provided。
3. runtime 在測試和運行時有效。
4. test 在測試時有效。
5. system 與本機系統相關聯,可移植性差。編譯和測試時有效。
6. import 導入的范圍,它只在使用dependencyManagement中,表示從其他pom中導入dependecy的配置。
課程練習
了解是是jar包
1、JAR 文件就是 Java Archive File,顧名思意,它的應用是與 Java 息息相關的,是 Java 的一種文檔格式。
2、JAR 文件與 ZIP 文件唯一的區別就是在 JAR 文件的內容中,包含了一個 META-INF/MANIFEST.MF 文件,這個文件是在生成 JAR 文件的時候自動創建的。
jar包:可以叫他文件包,通常是開發時要引用通用類,打成包便於存放管理。
在eclipse里面打jar包,手動調用jar包
tips:static修飾的類與方法,方便在沒有創建對象的情況下來進行調用(方法/變量)
舉例使用maven,比較程序員與程序員之間的區別,達爾文說過:人和動物的差別在於,普通vs優秀,在於優秀程序員善於使用工具,一個優秀程序員=三個普通程序員,質量,思考方式等等
完成一個小小的需求
普通程序員實現
舉例子-需求:
1、采用來源項目HTTPclient爬蟲下載帥哥圖片
2、圖片質量要高清的
3、HTTPclient要3.1版本,參考文檔見附件
什么是HTTPclient:字面理解
在官網查看使用文檔
http://hc.apache.org/httpclient-3.x/
tutorial
找jar包,付費,版本不對,下載的是空包或者是廣告。。。。特別浪費時間,工作效率低下
http://127.0.0.1:8088/1.jpg
放置圖片在tomcat中
D:\apache-tomcat-9.0.10\webapps\ROOT
File file=new File("1.jpg");
FileOutputStream fos =new FileOutputStream(file);
fos.write(responseBody);
fos.close();
優秀程序員的實現
做項目不僅需要技術,還需要要學會管理,善用工具
需要依賴各種jar,以及版本管理
自動讓maven管理依賴
優秀程序員工作效率是普通程序員的三倍
httpclient jar包引入maven
關鍵字解釋
generate 用於創建Maven 項目。
DartifactId 指定項目名稱。
DgroupId 指定包的名稱。
Dversion 指定版本號。
生成web工程標准結構->javaEE tools
---------------------------------------------------------------------------------------------------------------------------------
Maven教程
1.1. 介紹、環境配置
1.1.1. Maven介紹
Maven是一個采用純Java編寫的開源項目管理工具, Maven采用了一種被稱之為Project Object Model (POM)概念來管理項目,所有的項目配置信息都被定義在一個叫做POM.xml的文件中, 通過該文件Maven可以管理項目的整個生命周期,包括清除、編譯,測試,報告、打包、部署等等。目前Apache下絕大多數項目都已經采用Maven進行管理. 而Maven本身還支持多種插件, 可以方便更靈活的控制項目, 開發人員的主要任務應該是關注商業邏輯並去實現它, 而不是把時間浪費在學習如何在不同的環境中去依賴jar包,插件以及項目部署等。
Maven正是為了將開發人員從這些任務中解脫出來而誕生的
1.1.2. Maven能夠做什么
l Jar的聲明式依賴性管理
l 項目自動構建
1.1.3. 環境配置
l http://maven.apache.org/download.html 下載最新版本Maven 3.5.4 (Binary zip)
l 解壓到 D(本身就是綠色版不需要安裝):
l 配置環境變量(配置之前,必須確定配置了JDK環境變量)
1、配置MAVEN_HOME : D:\apache-maven-3.5.4\ apache-maven-3.5.4
2、把此命令添加到Path中: ;%MAVEN_HOME%\bin
l 驗證安裝是否成功
在命令行上輸入: mvn -version;回車, 如看到下面信息表示安裝成功
1.1.4. Maven目錄分析
l bin:含有mvn運行的腳本
l boot:含有plexus-classworlds類加載器框架
l conf:含有settings.xml配置文件
l lib:含有Maven運行時所需要的java類庫
l Settings.xml 中默認的用戶庫: ${user.home}/.m2/repository,可以修改為本地倉庫在settings.xml配置本地倉庫名稱;
Maven默認倉庫下載地址在: maven的lib目錄下maven-model-builder-3.5.4.jar的pom.xml中
1.2. 第一個Maven演示
1.2.1. 創建目錄結構
Convention Over Configuration (約定優於配置)。在現實生活中,有很多常識性的東西,地球人都知道。比如說:如何過馬路(紅燈停綠燈行),如何開門,關門等。
對於這些事情,人們已經有了默認的約定, 在軟件開發過程中,道理也是類似的,如果我們事先約定好所有項目的目錄結構,標准開發過程(編譯,測試) , 所有人都遵循這個約定。軟件項目的管理就會變得簡單很多。在現在流行的很多框架中,都使用了這個概念
我們來看看,maven工程標准目錄結構
HelloMaven --src -----main ----------java --用來存放Java文件 ----------resources --用來存放資源文件 -----test ---------java --用來存放測試的Java文件 ---------resources --target --項目輸出位置,編譯完畢后自動生成 --pom.xml -- 項目對象模型的描述 ,它是maven配置的核心 |
1.2.2. 建立pom.xml
<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"> <!-- 當前pom的版本號 --> <modelVersion>4.0.0</modelVersion> <!-- groupId: 組織名稱 --> <groupId>dongnaoedu</groupId> <!-- 當前項目模塊名稱 --> <artifactId>HelloMaven</artifactId> <!-- 當前項目的版本, SNAPSHOT鏡像版,不穩定版本 --> <version>0.0.1-SNAPSHOT</version> <!-- 當前模塊需要依賴的相關jar包,也稱為依賴管理, 所有被依賴的包都是通過"坐標"定位的 --> <dependencies> <!-- 需要依賴junit 通過 groupId+artifactId+version來查找,如果本地沒有則到中央倉庫下載 --> <dependency> <!-- 當前jar所屬的命名空間 --> <groupId>junit</groupId> <!-- 依賴的項目模塊的名稱 --> <artifactId>junit</artifactId> <!-- 依賴的版本號 --> <version>4.9</version> <!-- 依賴的范圍, 有 test compile privlege --> <scope>test</scope> </dependency> </dependencies> </project> |
pom.xml 文件是maven對一個項目的核心配置,這個文件將包含你希望如何構建項目的大多數配置信息。POM很復雜,不用全部去了解,只要使用一些常用的配置就可以了
1.2.3. 利用模板創建Java類與測試類
mvn archetype:generate
1.2.4. 命令測試
打開cmd命令行, 進入項目根目錄執行mvn compile命令, 查看根目錄變化
cmd 中繼續錄入mvn clean命令,然后再次查看根目錄變化
cmd 中錄入 mvn compile命令, 查看根目錄變化
cmd 中錄入 mvn test命令,查看根目錄變化
cmd 中錄入 mvn package命令,查看根目錄變化
1.3. Maven核心概念
1.3.1. Maven插件
Maven的核心僅僅定義了抽象的生命周期,具體的任務都是交由插件完成的每個插件都能實現多個功能,每個功能就是一個插件目標
Maven的生命周期與插件目標相互綁定,以完成某個具體的構建任務, Maven的插件在: .m2\repository\org\apache\maven\plugins
1.3.2. Maven坐標
類似在平面幾何中坐標(x,y)可以標識平面中唯一的一點, Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規范
擁有了統一規范,就可以把查找工作交給機器
Com.dongnao
l groupId:定義當前Maven項目組 (實際對應JAVA的包的結構,有些跟公司名稱相關的項目)
l artifactId:定義實際項目中的一個模塊(項目的唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱)
l version:定義當前項目的當前版本
1.3.3. Maven倉庫
l 何為Maven倉庫:用來統一存儲所有Maven共享構建的位置就是倉庫
l Maven配置jar包的路徑為:groupId/artifactId/version
l 本地倉庫(~/.m2/repository/):每個用戶只有一個本地倉庫
l 中央倉庫(Maven默認的遠程倉庫):Maven默認的遠程倉庫下載地址為:http://repo1.maven.org/maven2
l 私服:是一種特殊的遠程倉庫, 它是架設在局域網內的倉庫, 主要是為了團隊協作開發
1.4. 第二個Maven演示
1.4.1. 目錄結構
HelloMaven2 --src -----main ----------java ----------resources -----test ---------java ---------resources --pom.xml |
1.4.2. 建立Pom.xml
<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> maven</groupId> <artifactId> HelloMaven2</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>maven</groupId> <artifactId>HelloMaven</artifactId> <version>1.0.0</version> <scope>compile</scope> </dependency> </dependencies> </project> |
1.4.3. 創建Java類與測試類(同上)
1.4.4. 命令測試
l 在HelloWorld目錄下執行 mvn clean \mvn compile \mvn test 都正常
l 在HelloWorld目錄下執行命令mvn package 系統報錯說沒有找到依賴, 因為HelloWorld依賴Hello模塊,但是此模塊在個人倉庫和中央倉庫中並不存在
l 需要重新構建Hello第一個項目並安裝到數據倉庫, 在Hello根目錄下執行mvn clean install, 就會部署到本地倉庫中
1.5. Maven與Eclipse整合
1.5.1. 配置maven插件
去除多移的勾選項,最后結果如下:
1.5.2. user settings
1.6.Maven開發項目
1.6.1創建Java項目
l 在Eclipse創建項目的時候選擇Maven Project
l next后選擇默認工作空間
注意:如果不是創建簡單項目,將在后繼的步驟中,選擇相關向導;此向導也是插件,第一次使用的時候.也要從遠程倉庫中下載相應的jar包, 因此需要網絡環境
l 創建完畢后默認生成的項目包目錄如下
l 通過在pom.xml中單擊右鍵選擇相應的命令即可
1.7.Maven私服
1.7.1關於中央倉庫注意事項
l 地址: 目前來說: http://repo.maven.apache.org/maven2/是真正的Maven中央倉庫的地址,該地址內置在Maven的源碼中其他的都是鏡像
l 索引: 中央倉庫帶有索引文件以方便用戶對其進行搜索,完整的索引文件大小約為60M,索引每周更新一次
l 黑名單: 如果某個IP地址惡意的下載中央倉庫內容,例如全公司100台機器使用同一個IP反復下載,這個IP(甚至是IP段)會進入黑名單,因此稍有規模的使用Maven時,應該用Nexus架設私服
1.7.2為什么需要私服
為什么要搭建nexus私服,原因很多,例如有些公司都不提供外網給項目組人員,因此就不能使用maven訪問遠程的倉庫地址,所以很有必要在局域網里找一台有外網權限的機器,搭建nexus私服,然后開發人員連到這台私服上,這樣的話就可以通過這台搭建了nexus私服的電腦訪問maven的遠程倉庫
1.8.eclipse里面maven執行
保存后,buildpath
1.9.作業
作業:創建2個maven工程,使用其中一個生成jar,mvn install上傳jar到本地倉庫,另一個使用pom.xml引用前一個的jar