Maven理解

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

Maven概念

參考maven入門 冰河winner

Maven作為一個構建工具,不僅能幫我們自動化構建,還能夠抽象構建過程,提供構建任務實現;它跨平臺,對外提供了一致的操作接口,這一切足以使它成為優秀的、流行的構建工具。 Maven不僅是構建工具,還是一個依賴管理工具和項目管理工具,它提供了中央倉庫,能幫我自動下載構件

輸入圖片說明

  • bin目錄: 該目錄包含了mvn運行的腳本,這些腳本用來配置java命令,準備好classpath和相關的Java系統屬性,然后執行Java命令。
  • boot目錄: 該目錄只包含一個文件,該文件為plexus-classworlds-2.5.2.jar。plexus-classworlds是一個類加載器框架,相對于默認的java類加載器,它提供了更加豐富的語法以方便配置,Maven使用該框架加載自己的類庫。
  • conf目錄: 該目錄包含了一個非常重要的文件settings.xml。直接修改該文件,就能在機器上全局地定制Maven的行為,一般情況下,我們更偏向于復制該文件至~/.m2/目錄下(~表示用戶目錄),然后修改該文件,在用戶范圍定制Maven的行為。
  • lib目錄: 該目錄包含了所有Maven運行時需要的Java類庫,Maven本身是分模塊開發的,因此用戶能看到諸如maven-core-3.0.jar、maven-model-3.0.jar之類的文件,此外這里還包含一些Maven用到的第三方依賴如commons-cli-1.2.jar、commons-lang-2.6.jar等等。

maven 安裝(linux)(windows下不介紹了)

apache-maven-3.0.5-bin.zip

unzip apache-maven-3.0.5-bin.zip
mv apache-maven-3.0.5 /opt/modules/vi /etc/profile
export MAVEN_HOME=/opt/modules/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
mvn -verison
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 08:51:28-0500)
Maven home: /opt/modules/apache-maven-3.0.5
Java version: 1.7.0_67, vendor: Oracle Corporation
Java home: /opt/modules/jdk1.7.0_67/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-358.el6.x86_64", arch: "amd64", family: "unix"
cd /opt/modules/apache-maven-3.0.5/conf/
vi settings.xml
<!--指定本地倉庫的地址 -->
<localRepository>/opt/modules/apache-maven-3.0.5-localRepository</localRepository>

Maven常用命令說明

mvn clean:表示運行清理操作(會默認把target文件夾中的數據清理)。
mvn clean compile:表示先運行清理之后運行編譯,會將代碼編譯到target文件夾中。
mvn clean test:運行清理和測試。
mvn clean package:運行清理和打包。
mvn clean install:運行清理和安裝,會將打好的包安裝到本地倉庫中,以便其他的項目可以調用。
mvn clean deploy:運行清理和發布(發布到私服上面)。 輸入圖片說明

Maven使用

<?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><artifactId>TBDAP-MAIN</artifactId><packaging>war</packaging><name>jianxin</name><parent><groupId>com.jianxin</groupId><artifactId>TBDAP-PARENT</artifactId><version>0.0.2-SNAPSHOT</version><relativePath>../TBDAP-PARENT/pom.xml</relativePath></parent><dependencies><dependency><groupId>com.jianxin</groupId><artifactId>TBDAP-MANAGER</artifactId><version>${tbdap.version}</version><type>war</type></dependency><dependency><groupId>com.jianxin</groupId><artifactId>TBDAP_HOTEL</artifactId><version>${tbdap.version}</version><type>war</type></dependency></dependencies><build><finalName>tbdap</finalName><plugins><!-- 合并多個war --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><configuration><warSourceExcludes>WEB-INF/lib/spring-web-4.1.0.RELEASE.jar</warSourceExcludes><failOnMissingWebXml>false</failOnMissingWebXml><overlays><!-- 權限管理放在最前面 --><overlay><groupId>com.jianxin</groupId><artifactId>TBDAP-MANAGER</artifactId></overlay><!-- 權限管理放在最前面 --></overlays></configuration></plugin></plugins></build>
</project>

project是所有pom.xml的根元素,它還聲明了一些POM相關的命名空間及xsd元素。 根元素下的第一個子元素modelVersion指定了當前的POM模型的版本,對于Maven3來說,它只能是4.0.0 代碼中最重要是包含了groupId,artifactId和version了。這三個元素定義了一個項目基本的坐標,在Maven的世界,任何的jar、pom或者jar都是以基于這些基本的坐標進行區分的。

groupId定義了項目屬于哪個組,隨意命名,比如谷歌公司的myapp項目,就取名為 com.google.myapp

artifactId定義了當前Maven項目在組中唯一的ID,比如定義hello-world。

version指定了項目當前的版本0.0.1-SNAPSHOT,SNAPSHOT意為快照,說明該項目還處于開發中,是不穩定的。

name元素生命了一個對于用戶更為友好的項目名稱,雖然這不是必須的,但還是推薦為每個POM聲明name。

依賴的配置

根元素project下的dependencies可以包含一個或者多個dependency元素,以聲明一個或者多個項目依賴。每個依賴可以包含的元素有:

  • grounpId、artifactId和version:以來的基本坐標,對于任何一個依賴來說,基本坐標是最重要的,Maven根據坐標才能找到需要的依賴。
  • type:依賴的類型,對于項目坐標定義的packaging。大部分情況下,該元素不必聲明,其默認值為jar
  • scope:依賴的范圍
  • optional:標記依賴是否可選
  • exclusions:用來排除傳遞性依賴

可選的依賴

當不可能把一個項目分裂成子模塊(不管什么原因)的時候,我們可以使用可選的依賴。它的思想就是:在項目中一些依賴僅僅被某些功能使用,并且如果這個功能不被使用,這個依賴就不需要。理想情況下,根據核心的功能性項目,一個功能被分成子模塊… 如果你決定使用子模塊的功能,因為你必須需要他們的全部,所以新的子項目僅僅有不可選的依賴。 然而,因為這個項目不可能被分成子模塊,所以這些依賴被聲明成可選的。如果一個用戶想要使用和一個可選的依賴相關的功能,他們將不得不在他們自己的項目中重新聲明可選的依賴。用這種方法處理這種情況不是的最好的方式,但是可選的依賴和依賴排除也是一個權宜的解決辦法。

  • 選的依賴工作原理
    輸入圖片說明

如圖,項目中A依賴B,B依賴于X和Y,如果所有這三個的范圍都是compile的話,那么X和Y就是A的compile范圍的傳遞性依賴,但是如果我想X,Y不作為A的傳遞性依賴,不給他用的話。就需要下面提到的配置可選依賴。 輸入圖片說明

依賴范圍

依賴范圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、運行classpath)的關系,Maven有如下幾種依賴范圍:

  • compile:編譯依賴范圍。如果沒有指定,就會默認使用該依賴范圍。使用此依賴范圍的Maven依賴,對于編譯、測試、運行三種classpath都有效。典型的例子是spring-code,在編譯、測試和運行的時候都需要使用該依賴。(項目上一般用這種依賴)
  • test: 測試依賴范圍。使用次依賴范圍的Maven依賴,只對于測試classpath有效,在編譯主代碼或者運行項目的使用時將無法使用此依賴。典型的例子是Jnuit,它只有在編譯測試代碼及運行測試的時候才需要。
  • provided:已提供依賴范圍。使用此依賴范圍的Maven依賴,對于編譯和測試classpath有效,但在運行時候無效。典型的例子是servlet-api,編譯和測試項目的時候需要該依賴,但在運行項目的時候,由于容器以及提供,就不需要Maven重復地引入一遍。
  • runtime:運行時依賴范圍。使用此依賴范圍的Maven依賴,對于測試和運行classpath有效,但在編譯主代碼時無效。典型的例子是JDBC驅動實現,項目主代碼的編譯只需要JDK提供的JDBC接口,只有在執行測試或者運行項目的時候才需要實現上述接口的具體JDBC驅動。
  • system:系統依賴范圍。該依賴與三種classpath的關系,和provided依賴范圍完全一致,但是,使用system范圍的依賴時必須通過systemPath元素顯示地指定依賴文件的路徑。由于此類依賴不是通過Maven倉庫解析的,而且往往與本機系統綁定,可能構成構建的不可移植,因此應該謹慎使用。systemPath元素可以引用環境變量,如:

排除依賴

有時候你引入的依賴中包含你不想要的依賴包,你想引入自己想要的,這時候就要用到排除依賴了,比如下圖中spring-boot-starter-web自帶了logback這個日志包,我想引入log4j2的,所以我先排除掉logback的依賴包,再引入想要的包就行了. 輸入圖片說明

這里注意:聲明exclustion的時候只需要groupId和artifactId,而不需要version元素,這是因為只需要groupId和artifactId就能唯一定位依賴圖中的某個依賴。

歸類依賴

有時候我們引入的很多依賴包,他們都來自同一個項目的不同模塊,所以他們的版本號都一樣,這時候我們可以用屬性來統一管理版本號

<dependency><groupId>com.jianxin</groupId><artifactId>rtf</artifactId><version>${jianxin.version}</version>
</dependency>
<dependency><groupId>com.jianxin</groupId><artifactId>jianxin-utils</artifactId><version>${jianxin.version}</version>
</dependency>
<properties><jianxin.version>0.0.1</jianxin.version><jianxin.version>0.0.1</jianxin.version>
</properties>                   

maven 倉庫

輸入圖片說明

  • 本地倉庫 maven加壓包中conf下的setting.mxl中配置(windows下)
    <localRepository>D:/apache-maven-3.3.3/download</localRepository>
  • 遠程倉庫-中央倉庫
    由于最原始的本地倉庫是空的,Maven必須知道至少一個可用的遠程倉庫,才能在執行Maven命令的時候下載到需要的構件。中央倉庫就是這樣一個默認的遠程倉庫,Maven的安裝文件自帶了中央倉庫的配置。
    中央倉庫包含了這個世界上絕大多數流行的開源Java構件,以及源碼、作者信息、SCM,信息、許可證信息等,每個月這里都會接受全世界Java程序員大概1億次的訪問,它對全世界Java開發者的貢獻由此可見一斑。

  • 遠程倉庫-私服
    私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上之后,再為Maven的下載請求提供服務。因此,一些無法從外部倉庫下載到的構件也能從本地上傳到私服上供大家使用。 私服的好處:

    • 節省自己的外網速度
    • 加速Maven構建
    • 部署第三方構建
    • 提高穩定性,增強控制
    • 降低中央倉庫的負荷

看一下項目上的配置文件

<?xml version="1.0" encoding="UTF-8"?><!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
--><!--| This is the configuration file for Maven. It can be specified at two levels:||  1. User Level. This settings.xml file provides configuration for a single user, |                 and is normally provided in ${user.home}/.m2/settings.xml.||                 NOTE: This location can be overridden with the CLI option:||                 -s /path/to/user/settings.xml||  2. Global Level. This settings.xml file provides configuration for all Maven|                 users on a machine (assuming they're all using the same Maven|                 installation). It's normally provided in |                 ${maven.home}/conf/settings.xml.||                 NOTE: This location can be overridden with the CLI option:||                 -gs /path/to/global/settings.xml|| The sections in this sample file are intended to give you a running start at| getting the most out of your Maven installation. Where appropriate, the default| values (values used when the setting is not specified) are provided.||-->
<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| The path to the local repository maven will use to store artifacts.|| Default: ${user.home}/.m2/repository<localRepository>/path/to/local/repo</localRepository>--><!-- 配置maven本地倉庫 --><localRepository>D:/apache-maven-3.3.3/download</localRepository><!-- interactiveMode| This will determine whether maven prompts you when it needs input. If set to false,| maven will use a sensible default value, perhaps based on some other setting, for| the parameter in question.|| Default: true<interactiveMode>true</interactiveMode>--><!-- offline| Determines whether maven should attempt to connect to the network when executing a build.| This will have an effect on artifact downloads, artifact deployment, and others.|| Default: false<offline>false</offline>--><!-- pluginGroups| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.|--><pluginGroups><!-- pluginGroup| Specifies a further group identifier to use for plugin lookup.<pluginGroup>com.your.plugins</pluginGroup>--></pluginGroups><!-- proxies| This is a list of proxies which can be used on this machine to connect to the network.| Unless otherwise specified (by system property or command-line switch), the first proxy| specification in this list marked as active will be used.|--><!-- 配置maven代理 --><proxies><!-- proxy| Specification for one proxy, to be used in connecting to the network.|<proxy><id>optional</id><active>true</active><protocol>http</protocol><username>proxyuser</username><password>proxypass</password><host>proxy.host.net</host><port>80</port><nonProxyHosts>local.net|some.host.com</nonProxyHosts></proxy>--></proxies><!-- servers| This is a list of authentication profiles, keyed by the server-id used within the system.| Authentication profiles can be used whenever maven must make a connection to a remote server.|--><servers><!-- server| Specifies the authentication information to use when connecting to a particular server, identified by| a unique name within the system (referred to by the 'id' attribute below).| | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are |       used together.|<server><id>deploymentRepo</id><username>repouser</username><password>repopwd</password></server>--><!-- Another sample, using keys to authenticate.<server><id>siteServer</id><privateKey>/path/to/private/key</privateKey><passphrase>optional; leave empty if not used.</passphrase></server>--><!--  遠程倉庫的認證,大部分的遠程倉庫不需要認證,但是如果是自己內部使用,為了安全起見,還是要配置認證信息的。
配置認證信息和配置遠程倉庫不同,遠程倉庫可以直接在pom.xml中配置,但是認證信息必須配置在settings.xml文件中。這是因為pom往往是被提交到代碼倉庫中供所有成員訪問的,而settings.xml一般只存在于本機。因此,在settings.xml中配置認證信息更為安全。 --><server><id>nexus-releases</id><username>admin</username><password>jianxin2016!@#$%</password></server><server> <id>nexus-snapshots</id><username>admin</username><password>jianxin2016!@#$%</password></server></servers><!-- mirrors| This is a list of mirrors to be used in downloading artifacts from remote repositories.| | It works like this: a POM may declare a repository to use in resolving certain artifacts.| However, this repository may have problems with heavy traffic at times, so people have mirrored| it to several places.|| That repository definition will have a unique id, so we can create a mirror reference for that| repository, to be used as an alternate download site. The mirror site will be the preferred | server for that repository.|--><!-- 配置鏡像 --><mirrors><!-- mirror| Specifies a repository mirror site to use instead of a given repository. The repository that| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.|<mirror><id>mirrorId</id><mirrorOf>repositoryId</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://my.repository.com/repo/path</url></mirror>--></mirrors><!-- profiles| This is a list of profiles which can be activated in a variety of ways, and which can modify| the build process. Profiles provided in the settings.xml are intended to provide local machine-| specific paths and repository locations which allow the build to work in the local environment.|| For example, if you have an integration testing plugin - like cactus - that needs to know where| your Tomcat instance is installed, you can provide a variable here such that the variable is | dereferenced during the build process to configure the cactus plugin.|| As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles| section of this document (settings.xml) - will be discussed later. Another way essentially| relies on the detection of a system property, either matching a particular value for the property,| or merely testing its existence. Profiles can also be activated by JDK version prefix, where a | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.| Finally, the list of active profiles can be specified directly from the command line.|| NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact|       repositories, plugin repositories, and free-form properties to be used as configuration|       variables for plugins in the POM.||--><profiles><!-- 遠程倉庫的設置 --><!-- -repository:在repositories元素下,可以使用repository子元素聲明一個或者多個遠程倉庫。
- id:倉庫聲明的唯一id,尤其需要注意的是,Maven自帶的中央倉庫使用的id為central,如果其他倉庫聲明也使用該id,就會覆蓋中央倉庫的配置。
- name:倉庫的名稱,讓我們直觀方便的知道倉庫是哪個,暫時沒發現其他太大的含義。
- url:指向了倉庫的地址,一般來說,該地址都基于http協議,Maven用戶都可以在瀏覽器中打開倉庫地址瀏覽構件。
- releases和snapshots:用來控制Maven對于發布版構件和快照版構件的下載權限。需要注意的是enabled子元素,該例中releases的enabled值為true,表示開啟JBoss倉庫的發布版本下載支持,而snapshots的enabled值為false,表示關閉JBoss倉庫的快照版本的下載支持。根據該配置,Maven只會從JBoss倉庫下載發布版的構件,而不會下載快照版的構件。
- layout:元素值default表示倉庫的布局是Maven2及Maven3的默認布局,而不是Maven1的布局。基本不會用到Maven1的布局。
- 其他:對于releases和snapshots來說,除了enabled,它們還包含另外兩個子元素updatePolicy和checksumPolicy。
1:元素updatePolicy用來配置Maven從遠處倉庫檢查更新的頻率,默認值是daily,表示Maven每天檢查一次。其他可用的值包括:never-從不檢查更新;always-每次構建都檢查更新;interval:X-每隔X分鐘檢查一次更新(X為任意整數)。
2:元素checksumPolicy用來配置Maven檢查校驗和文件的策略。當構建被部署到Maven倉庫中時,會同時部署對應的檢驗和文件。在下載構件的時候,Maven會驗證校驗和文件,如果校驗和驗證失敗,當checksumPolicy的值為默認的warn時,Maven會在執行構建時輸出警告信息,其他可用的值包括:fail-Maven遇到校驗和錯誤就讓構建失敗;ignore-使Maven完全忽略校驗和錯誤。 --><profile><id>nexusProfile</id><repositories><repository><id>nexus</id><name>Repository</name><!-- ip地址已經隨便更改 --><url>http://172.51.123.121:9037/nexus/content/groups/public/</url><layout>default</layout><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>nexus</id><name>local private nexus</name><url>http://172.51.123.121:9037/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories></profile><profile>  <id>jdk17</id>  <activation>  <activeByDefault>true</activeByDefault>  <jdk>1.7</jdk>  </activation>  <properties>  <maven.compiler.source>1.7</maven.compiler.source>  <maven.compiler.target>1.7</maven.compiler.target>  <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>  </properties>   </profile>  </profiles><!-- activeProfiles| List of profiles that are active for all builds.|--><activeProfiles><activeProfile>nexusProfile</activeProfile></activeProfiles></settings>

基礎配置

一個典型的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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 模型版本。maven2.0必須是這樣寫,現在是maven2唯一支持的版本 --><modelVersion>4.0.0</modelVersion><!-- 公司或者組織的唯一標志,并且配置時生成的路徑也是由此生成, 如com.winner.trade,maven會將該項目打成的jar包放本地路徑:/com/winner/trade --><groupId>com.winner.trade</groupId><!-- 本項目的唯一ID,一個groupId下面可能多個項目,就是靠artifactId來區分的 --><artifactId>trade-core</artifactId><!-- 本項目目前所處的版本號 --><version>1.0.0-SNAPSHOT</version><!-- 打包的機制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默認為jar --><packaging>jar</packaging><!-- 幫助定義構件輸出的一些附屬構件,附屬構件與主構件對應,有時候需要加上classifier才能唯一的確定該構件 不能直接定義項目的classifer,因為附屬構件不是項目直接默認生成的,而是由附加的插件幫助生成的 --><classifier>...</classifier><!-- 定義本項目的依賴關系 --><dependencies><!-- 每個dependency都對應這一個jar包 --><dependency><!--一般情況下,maven是通過groupId、artifactId、version這三個元素值(俗稱坐標)來檢索該構件, 然后引入你的工程。如果別人想引用你現在開發的這個項目(前提是已開發完畢并發布到了遠程倉庫),--> <!--就需要在他的pom文件中新建一個dependency節點,將本項目的groupId、artifactId、version寫入, maven就會把你上傳的jar包下載到他的本地 --><groupId>com.winner.trade</groupId><artifactId>trade-test</artifactId><version>1.0.0-SNAPSHOT</version><!-- maven認為,程序對外部的依賴會隨著程序的所處階段和應用場景而變化,所以maven中的依賴關系有作用域(scope)的限制。 --><!--scope包含如下的取值:compile(編譯范圍)、provided(已提供范圍)、runtime(運行時范圍)、test(測試范圍)、system(系統范圍) --><scope>test</scope><!-- 設置指依賴是否可選,默認為false,即子項目默認都繼承:為true,則子項目必需顯示的引入,與dependencyManagement里定義的依賴類似  --><optional>false</optional><!-- 屏蔽依賴關系。 比如項目中使用的libA依賴某個庫的1.0版,libB依賴某個庫的2.0版,現在想統一使用2.0版,就應該屏蔽掉對1.0版的依賴 --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions></dependency></dependencies><!-- 為pom定義一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} --><properties><file.encoding>UTF-8</file.encoding><java.source.version>1.5</java.source.version><java.target.version>1.5</java.target.version></properties>...
</project>

一般來說,上面的幾個配置項對任何項目都是必不可少的,定義了項目的基本屬性。

這里有必要對一個不太常用的屬性classifier做一下解釋,因為有時候引用某個jar包,classifier不寫的話會報錯。

classifier元素用來幫助定義構件輸出的一些附屬構件。附屬構件與主構件對應,比如主構件是 kimi-app-2.0.0.jar,該項目可能還會通過使用一些插件生成 如kimi-app-2.0.0-javadoc.jar (Java文檔)、 kimi-app-2.0.0-sources.jar(Java源代碼) 這樣兩個附屬構件。這時候,javadoc、sources就是這兩個附屬構件的classifier,這樣附屬構件也就擁有了自己唯一的坐標。

classifier的用途在于:

  1. maven download javadoc / sources jar包的時候,需要借助classifier指明要下載那個附屬構件

  2. 引入依賴的時候,有時候僅憑groupId、artifactId、version無法唯一的確定某個構件,需要借助classifier來進一步明確目標。比如JSON-lib,有時候會同一個版本會提供多個jar包,在JDK1.5環境下是一套,在JDK1.3環境下是一套: 輸入圖片說明 引用它的時候就要注明JDK版本,否則maven不知道你到底需要哪一套jar包:

<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier>
</dependency>

構建配置(非常重要,解決了項目上MyBatis mapper文件不能掃描打包的問題)

pom.xml中配置如下

<build><!-- 產生的構件的文件名,默認值是${artifactId}-${version}。 --><finalName>myPorjectName</finalName><!-- 構建產生的所有文件存放的目錄,默認為${basedir}/target,即項目根目錄下的target --><directory>${basedir}/target</directory><!--當項目沒有規定目標(Maven2叫做階段(phase))時的默認值, --><!--必須跟命令行上的參數相同例如jar:jar,或者與某個階段(phase)相同例如install、compile等 --><defaultGoal>install</defaultGoal><!--當filtering開關打開時,使用到的過濾器屬性文件列表。 --><!--項目配置信息中諸如${spring.version}之類的占位符會被屬性文件中的實際值替換掉 --><filters><filter>../filter.properties</filter></filters><!--項目相關的所有資源路徑列表,例如和項目相關的配置文件、屬性文件,這些資源被包含在最終的打包文件里。 --><resources><resource><!--描述了資源的目標路徑。該路徑相對target/classes目錄(例如${project.build.outputDirectory})。 --><!--舉個例子,如果你想資源在特定的包里(org.apache.maven.messages),你就必須該元素設置為org/apache/maven/messages。 --><!--然而,如果你只是想把資源放到源碼目錄結構里,就不需要該配置。 --><targetPath>resources</targetPath><!--是否使用參數值代替參數名。參數值取自properties元素或者文件里配置的屬性,文件在filters元素里列出。 --><filtering>true</filtering><!--描述存放資源的目錄,該路徑相對POM路徑 --><directory>src/main/resources</directory><!--包含的模式列表 --><includes><include>**/*.properties</include><include>**/*.xml</include></includes><!--排除的模式列表 如果<include>與<exclude>劃定的范圍存在沖突,以<exclude>為準 --><excludes><exclude>jdbc.properties</exclude></excludes></resource></resources><!--單元測試相關的所有資源路徑,配制方法與resources類似 --><testResources><testResource><targetPath /><filtering /><directory /><includes /><excludes /></testResource></testResources><!--項目源碼目錄,當構建項目的時候,構建系統會編譯目錄里的源碼。該路徑是相對于pom.xml的相對路徑。 --><sourceDirectory>${basedir}\src\main\java</sourceDirectory><!--項目腳本源碼目錄,該目錄和源碼目錄不同, <!-- 絕大多數情況下,該目錄下的內容會被拷貝到輸出目錄(因為腳本是被解釋的,而不是被編譯的)。 --><scriptSourceDirectory>${basedir}\src\main\scripts</scriptSourceDirectory><!--項目單元測試使用的源碼目錄,當測試項目的時候,構建系統會編譯目錄里的源碼。該路徑是相對于pom.xml的相對路徑。 --><testSourceDirectory>${basedir}\src\test\java</testSourceDirectory><!--被編譯過的應用程序class文件存放的目錄。 --><outputDirectory>${basedir}\target\classes</outputDirectory><!--被編譯過的測試class文件存放的目錄。 --><testOutputDirectory>${basedir}\target\test-classes</testOutputDirectory><!--項目的一系列構建擴展,它們是一系列build過程中要使用的產品,會包含在running bulid‘s classpath里面。 --><!--他們可以開啟extensions,也可以通過提供條件來激活plugins。 --><!--簡單來講,extensions是在build過程被激活的產品 --><extensions><!--例如,通常情況下,程序開發完成后部署到線上Linux服務器,可能需要經歷打包、 --><!--將包文件傳到服務器、SSH連上服務器、敲命令啟動程序等一系列繁瑣的步驟。 --><!--實際上這些步驟都可以通過Maven的一個插件 wagon-maven-plugin 來自動完成 --><!--下面的擴展插件wagon-ssh用于通過SSH的方式連接遠程服務器, --><!--類似的還有支持ftp方式的wagon-ftp插件 --><extension><groupId>org.apache.maven.wagon</groupId><artifactId>wagon-ssh</artifactId><version>2.8</version></extension></extensions><!--使用的插件列表 。 --><plugins><plugin><groupId></groupId><artifactId>maven-assembly-plugin</artifactId><version>2.5.5</version><!--在構建生命周期中執行一組目標的配置。每個目標可能有不同的配置。 --><executions><execution><!--執行目標的標識符,用于標識構建過程中的目標,或者匹配繼承過程中需要合并的執行目標 --><id>assembly</id><!--綁定了目標的構建生命周期階段,如果省略,目標會被綁定到源數據里配置的默認階段 --><phase>package</phase><!--配置的執行目標 --><goals><goal>single</goal></goals><!--配置是否被傳播到子POM --><inherited>false</inherited></execution></executions><!--作為DOM對象的配置,配置項因插件而異 --><configuration><finalName>${finalName}</finalName><appendAssemblyId>false</appendAssemblyId><descriptor>assembly.xml</descriptor></configuration><!--是否從該插件下載Maven擴展(例如打包和類型處理器), --><!--由于性能原因,只有在真需要下載時,該元素才被設置成true。 --><extensions>false</extensions><!--項目引入插件所需要的額外依賴 --><dependencies><dependency>...</dependency></dependencies><!--任何配置是否被傳播到子項目 --><inherited>true</inherited></plugin></plugins><!--主要定義插件的共同元素、擴展元素集合,類似于dependencyManagement, --><!--所有繼承于此項目的子項目都能使用。該插件配置項直到被引用時才會被解析或綁定到生命周期。 --><!--給定插件的任何本地配置都會覆蓋這里的配置 --><pluginManagement><plugins>...</plugins></pluginManagement></build>

項目上的一個構建

<build><finalName>TBDAP-MANAGER</finalName><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><plugins><!-- 合并多個war --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><configuration><warSourceExcludes>WEB-INF/lib/spring-web-4.1.0.RELEASE.jar</warSourceExcludes><failOnMissingWebXml>false</failOnMissingWebXml><overlays><!-- 權限管理放在最前面 --><overlay><groupId>com.inspur</groupId><artifactId>TBDAP-MANAGER</artifactId></overlay><!-- 權限管理放在最前面 --></overlays></configuration></plugin></plugins></build>

設置http代理

編輯conf/seeting.xml文件 有時候你所在的公司基于安全因素考慮,要求你使用通過安全認證的代理訪問因特網。這種情況下,就需要為Maven配置HTTP代理,才能讓它正常訪問外部倉庫,以下載所需要的資源。首先確認自己無法直接訪問公共的maven中央倉庫,直接運行命令ping repo1.maven.org可以檢查網絡。如果真的需要代理,先檢查一下代理服務器是否暢通。比如現在有一個IP地址為218.14.227.197,端口為3128的代理服務,我們可以運行telnet 218.14.227.197 3128來檢測該地址的該端口是否暢通。

username,password,nonProxyHosts幾個元素。當代理服務需要認證時,就需要配置username和password。nonProxyHost元素用來指定哪些主機不需要代理,可以使用"|"符號來分隔多個主機名。此外,該配置也支持通配符,如:*.google.com表示所有以google.com結尾的域名訪問都不要通過代理。

部署構件至遠程倉庫

我們自己搭建遠程倉庫的目的就是為了可以方便部署我們自己項目的構件以及一些無法從外部倉庫直接獲取的構件。這樣才能在開發時,供其他對團隊成員使用。 Maven除了能對項目進行編譯、測試、打包之外,還能將項目生成的構件部署到遠程倉庫中。首先,需要編輯項目的pom.xml文件。配置distributionManagement元素,代碼如下:


<!--項目分發信息,在執行mvn deploy后表示要發布的位置。 -->
<!--有了這些信息就可以把網站部署到遠程服務器或者把構件部署到遠程倉庫。 -->
<distributionManagement><!--部署項目產生的構件到遠程倉庫需要的信息 --><repository><!--是分配給快照一個唯一的版本號(由時間戳和構建流水號),還是每次都使用相同的版本號 --><!--參見repositories/repository元素 --><uniqueVersion>true</uniqueVersion><id> repo-id </id><name> repo-name</name><url>file://${basedir}/target/deploy </url><layout /></repository><!--構件的快照部署到哪里,如果沒有配置該元素,默認部署到repository元素配置的倉庫 --><snapshotRepository><uniqueVersion /><id /><name /><url /><layout /></snapshotRepository><!--部署項目的網站需要的信息 --><site><!--部署位置的唯一標識符,用來匹配站點和settings.xml文件里的配置 --><id> site-id </id><!--部署位置的名稱 --><name> site-name</name><!--部署位置的URL,按protocol://hostname/path形式 --><url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url></site><!--項目下載頁面的URL。如果沒有該元素,用戶應該參考主頁。 --><!--使用該元素的原因是:幫助定位那些不在倉庫里的構件(由于license限制)。 --><downloadUrl /><!--如果構件有了新的groupID和artifact ID(構件移到了新的位置),這里列出構件的重定位信息。 --><relocation><!--構件新的group ID --><groupId /><!--構件新的artifact ID --><artifactId /><!--構件新的版本號 --><version /><!--顯示給用戶的,關于移動的額外信息,例如原因。 --><message /></relocation><!--給出該構件在遠程倉庫的狀態。不得在本地項目中設置該元素,因為這是工具自動更新的。 --><!--有效的值有:none(默認),converted(倉庫管理員從Maven 1 POM轉換過來), --><!--partner(直接從伙伴Maven 2倉庫同步過來),deployed(從Maven 2實例部署),verified(被核實時正確的和最終的)。 --><status /></distributionManagement>

分發配置

<!--項目分發信息,在執行mvn deploy后表示要發布的位置。 -->
<!--有了這些信息就可以把網站部署到遠程服務器或者把構件部署到遠程倉庫。 -->
<distributionManagement><!--部署項目產生的構件到遠程倉庫需要的信息 --><repository><!--是分配給快照一個唯一的版本號(由時間戳和構建流水號),還是每次都使用相同的版本號 --><!--參見repositories/repository元素 --><uniqueVersion>true</uniqueVersion><id> repo-id </id><name> repo-name</name><url>file://${basedir}/target/deploy </url><layout /></repository><!--構件的快照部署到哪里,如果沒有配置該元素,默認部署到repository元素配置的倉庫 --><snapshotRepository><uniqueVersion /><id /><name /><url /><layout /></snapshotRepository><!--部署項目的網站需要的信息 --><site><!--部署位置的唯一標識符,用來匹配站點和settings.xml文件里的配置 --><id> site-id </id><!--部署位置的名稱 --><name> site-name</name><!--部署位置的URL,按protocol://hostname/path形式 --><url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url></site><!--項目下載頁面的URL。如果沒有該元素,用戶應該參考主頁。 --><!--使用該元素的原因是:幫助定位那些不在倉庫里的構件(由于license限制)。 --><downloadUrl /><!--如果構件有了新的groupID和artifact ID(構件移到了新的位置),這里列出構件的重定位信息。 --><relocation><!--構件新的group ID --><groupId /><!--構件新的artifact ID --><artifactId /><!--構件新的版本號 --><version /><!--顯示給用戶的,關于移動的額外信息,例如原因。 --><message /></relocation><!--給出該構件在遠程倉庫的狀態。不得在本地項目中設置該元素,因為這是工具自動更新的。 --><!--有效的值有:none(默認),converted(倉庫管理員從Maven 1 POM轉換過來), --><!--partner(直接從伙伴Maven 2倉庫同步過來),deployed(從Maven 2實例部署),verified(被核實時正確的和最終的)。 --><status /></distributionManagement>

倉庫配置


<!--發現依賴和擴展的遠程倉庫列表。 -->
<repositories><!--包含需要連接到遠程倉庫的信息 --><repository><!--如何處理遠程倉庫里發布版本的下載 --><releases><!--true或者false表示該倉庫是否為下載某種類型構件(發布版,快照版)開啟。 --><enabled /><!--該元素指定更新發生的頻率。Maven會比較本地POM和遠程POM的時間戳。 --><!--這里的選項是:always(一直),daily(默認,每日), --><!--interval:X(這里X是以分鐘為單位的時間間隔),或者never(從不)。 --><updatePolicy /><!--當Maven驗證構件校驗文件失敗時該怎么做: --><!--ignore(忽略),fail(失敗),或者warn(警告)。 --><checksumPolicy /></releases><!--如何處理遠程倉庫里快照版本的下載。有了releases和snapshots這兩組配置, --><!--POM就可以在每個單獨的倉庫中,為每種類型的構件采取不同的策略。 --><!--例如,可能有人會決定只為開發目的開啟對快照版本下載的支持 --><snapshots><enabled /><updatePolicy /><checksumPolicy /></snapshots><!--遠程倉庫唯一標識符。可以用來匹配在settings.xml文件里配置的遠程倉庫 --><id> repo-id </id><!--遠程倉庫名稱 --><name> repo-name</name><!--遠程倉庫URL,按protocol://hostname/path形式 --><url>http://192.168.1.169:9999/repository/ </url><!--用于定位和排序構件的倉庫布局類型-可以是default(默認)或者legacy(遺留)。 --><!--Maven 2為其倉庫提供了一個默認的布局; --><!--然而,Maven1.x有一種不同的布局。 --><!--我們可以使用該元素指定布局是default(默認)還是legacy(遺留)。 --><layout> default</layout></repository></repositories><!--發現插件的遠程倉庫列表,這些插件用于構建和報表 -->
<pluginRepositories><!--包含需要連接到遠程插件倉庫的信息.參見repositories/repository元素 --><pluginRepository /></pluginRepositories>

profile配置

<!--在列的項目構建profile,如果被激活,會修改構建處理 -->
<profiles><!--根據環境參數或命令行參數激活某個構建處理 --><profile><!--自動觸發profile的條件邏輯。Activation是profile的開啟鑰匙。 --><activation><!--profile默認是否激活的標識 --><activeByDefault>false</activeByDefault><!--activation有一個內建的java版本檢測,如果檢測到jdk版本與期待的一樣,profile被激活。 --><jdk>1.7</jdk><!--當匹配的操作系統屬性被檢測到,profile被激活。os元素可以定義一些操作系統相關的屬性。 --><os><!--激活profile的操作系統的名字 --><name>Windows XP</name><!--激活profile的操作系統所屬家族(如 'windows') --><family>Windows</family><!--激活profile的操作系統體系結構 --><arch>x86</arch><!--激活profile的操作系統版本 --><version>5.1.2600</version></os><!--如果Maven檢測到某一個屬性(其值可以在POM中通過${名稱}引用),其擁有對應的名稱和值,Profile就會被激活。 --><!-- 如果值字段是空的,那么存在屬性名稱字段就會激活profile,否則按區分大小寫方式匹配屬性值字段 --><property><!--激活profile的屬性的名稱 --><name>mavenVersion</name><!--激活profile的屬性的值 --><value>2.0.3</value></property><!--提供一個文件名,通過檢測該文件的存在或不存在來激活profile。missing檢查文件是否存在,如果不存在則激活profile。 --><!--另一方面,exists則會檢查文件是否存在,如果存在則激活profile。 --><file><!--如果指定的文件存在,則激活profile。 --><exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists><!--如果指定的文件不存在,則激活profile。 --><missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing></file></activation><id /><build /><modules /><repositories /><pluginRepositories /><dependencies /><reporting /><dependencyManagement /><distributionManagement /><properties /></profile>

項目信息配置


<!--項目的名稱, Maven產生的文檔用 -->
<name>banseon-maven </name><!--項目主頁的URL, Maven產生的文檔用 -->
<url>http://www.clf.com/ </url><!--項目的詳細描述, Maven 產生的文檔用。 當這個元素能夠用HTML格式描述時 -->
<!--(例如,CDATA中的文本會被解析器忽略,就可以包含HTML標簽),不鼓勵使用純文本描述。 -->
<!-- 如果你需要修改產生的web站點的索引頁面,你應該修改你自己的索引頁文件,而不是調整這里的文檔。 -->
<description>A maven project to study maven. </description><!--描述了這個項目構建環境中的前提條件。 -->
<prerequisites><!--構建該項目或使用該插件所需要的Maven的最低版本 --><maven /></prerequisites><!--項目創建年份,4位數字。當產生版權信息時需要使用這個值。 -->
<inceptionYear /><!--項目相關郵件列表信息 -->
<mailingLists><!--該元素描述了項目相關的所有郵件列表。自動產生的網站引用這些信息。 --><mailingList><!--郵件的名稱 --><name> Demo </name><!--發送郵件的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建 --><post> clf@126.com</post><!--訂閱郵件的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建 --><subscribe> clf@126.com</subscribe><!--取消訂閱郵件的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建 --><unsubscribe> clf@126.com</unsubscribe><!--你可以瀏覽郵件信息的URL --><archive> http:/hi.clf.com/</archive></mailingList></mailingLists><!--項目開發者列表 -->
<developers><!--某個項目開發者的信息 --><developer><!--SCM里項目開發者的唯一標識符 --><id> HELLO WORLD </id><!--項目開發者的全名 --><name> banseon </name><!--項目開發者的email --><email> banseon@126.com</email><!--項目開發者的主頁的URL --><url /><!--項目開發者在項目中扮演的角色,角色元素描述了各種角色 --><roles><role> Project Manager</role><role>Architect </role></roles><!--項目開發者所屬組織 --><organization> demo</organization><!--項目開發者所屬組織的URL --><organizationUrl>http://hi.clf.com/ </organizationUrl><!--項目開發者屬性,如即時消息如何處理等 --><properties><dept> No </dept></properties><!--項目開發者所在時區, -11到12范圍內的整數。 --><timezone> -5</timezone></developer></developers><!--項目的其他貢獻者列表 -->
<contributors><!--項目的其他貢獻者。參見developers/developer元素 --><contributor><name /><email /><url /><organization /><organizationUrl /><roles /><timezone /><properties /></contributor></contributors><!--該元素描述了項目所有License列表。應該只列出該項目的license列表,不要列出依賴項目的license列表。 -->
<!--如果列出多個license,用戶可以選擇它們中的一個而不是接受所有license。 -->
<licenses><!--描述了項目的license,用于生成項目的web站點的license頁面,其他一些報表和validation也會用到該元素。 --><license><!--license用于法律上的名稱 --><name> Apache 2 </name><!--官方的license正文頁面的URL --><url>http://www.clf.com/LICENSE-2.0.txt </url><!--項目分發的主要方式: repo,可以從Maven庫下載 manual, 用戶必須手動下載和安裝依賴 --><distribution> repo</distribution><!--關于license的補充信息 --><comments> Abusiness-friendly OSS license </comments></license></licenses><!--SCM(Source Control Management)標簽允許你配置你的代碼庫,供Maven web站點和其它插件使用。 -->
<scm><!--SCM的URL,該URL描述了版本庫和如何連接到版本庫。欲知詳情,請看SCMs提供的URL格式和列表。該連接只讀。 --><connection>scm:svn:http://svn.baidu.com/banseon/maven/</connection><!--給開發者使用的,類似connection元素。即該連接不僅僅只讀 --><developerConnection>scm:svn:http://svn.baidu.com/banseon/maven/</developerConnection><!--當前代碼的標簽,在開發階段默認為HEAD --><tag /><!--指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。 --><url> http://svn.baidu.com/banseon</url></scm><!--描述項目所屬組織的各種屬性。Maven產生的文檔用 -->
<organization><!--組織的全名 --><name> demo </name><!--組織主頁的URL --><url> http://www.clf.com/</url></organization> 

環境配置

<!--項目的問題管理系統(Bugzilla, Jira, Scarab,或任何你喜歡的問題管理系統)的名稱和URL,本例為 jira -->
<issueManagement><!--問題管理系統(例如jira)的名字, --><system> jira </system><!--該項目使用的問題管理系統的URL --><url> http://jira.clf.com/</url></issueManagement><!--項目持續集成信息 -->
<ciManagement><!--持續集成系統的名字,例如continuum --><system /><!--該項目使用的持續集成系統的URL(如果持續集成系統有web接口的話)。 --><url /><!--構建完成時,需要通知的開發者/用戶的配置項。包括被通知者信息和通知條件(錯誤,失敗,成功,警告) --><notifiers><!--配置一種方式,當構建中斷時,以該方式通知用戶/開發者 --><notifier><!--傳送通知的途徑 --><type /><!--發生錯誤時是否通知 --><sendOnError /><!--構建失敗時是否通知 --><sendOnFailure /><!--構建成功時是否通知 --><sendOnSuccess /><!--發生警告時是否通知 --><sendOnWarning /><!--不贊成使用。通知發送到哪里 --><address /><!--擴展配置項 --><configuration /></notifier></notifiers></ciManagement>

轉載于:https://my.oschina.net/jiansin/blog/1788495

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254992.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HALCON示例程序measure_circles.hdev測量圓的半徑

HALCON示例程序measure_circles.hdev測量圓的半徑 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘circle_plate’) get_image_size (Image, Width, Height) dev_close_window () dev_open_window (0, 0, Width / 2…

OpenTLD 未完成 - 虎頭

TLD是一種算法的簡稱&#xff0c;原作者把它叫做Tracking-Learning-Detection。搞視覺的人看到這個名字都會嚇一跳&#xff0c;很ambitious的計劃。是09年的工作&#xff0c;不算太久&#xff0c;不過也不太新。網上關于這個的資源其實很多&#xff0c;很大程度和作者開放源代碼…

C# FileSystemWatcher 在監控文件夾和文件時的用法

********************************************************************************** 第一個文章: ********************************************************************************** 概述 最近學習FileSystemWatcher的用法,它主要是監控一個文件夾,當文件夾內的文件要…

比微軟kinect更強的視頻跟蹤算法--TLD跟蹤算法介紹

TLD (Tracking-Learning-Detection)是英國薩里大學的一個捷克籍博士生在其攻讀博士學位期間提出的一種新的單目標長時間&#xff08; long term tracking &#xff09;跟蹤算法。該算法與傳統跟蹤算法的顯著區別在于將傳統的跟蹤算法和傳統的檢測算法相結合來解決被跟蹤目標在被…

HALCON示例程序measure_circuit_width_lines_gauss.hdev電路板線寬檢測

HALCON示例程序measure_circuit_width_lines_gauss.hdev電路板線寬檢測 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () dev_close_window () read_image (Image, ‘pcb_color’) get_image_size (Image, Width, Height) dev_open_window…

一張圖看懂混合云數據同步一站式解決方案

摘要&#xff1a; 針對不同數據庫間數據實時同步難的問題&#xff0c;日前&#xff0c;阿里云宣布推出混合云數據同步一站式解決方案&#xff0c;便于廣大云產品用戶實現實時數據同步的混合云支持&#xff0c;更為方便的是&#xff0c;該功能讓本地Oracle也能實現與云上數據庫的…

分布式性能測試

Jmeter分布式測試 在使用Jmeter進行性能測試時&#xff0c;如果并發數比較大(比如最近項目需要支持1000并發)&#xff0c;單臺電腦的配置(CPU和內存)可能無法支持&#xff0c;這時可以使用Jmeter提供的分布式測試的功能。 一、Jmeter分布式執行原理&#xff1a; 1、Jmeter分布式…

互斥鎖pthread_mutex_t的使用

1. 互斥鎖創建 有兩種方法創建互斥鎖&#xff0c;靜態方式和動態方式。POSIX定義了一個宏PTHREAD_MUTEX_INITIALIZER來靜態初始化互斥鎖&#xff0c;方法如下&#xff1a; pthread_mutex_t mutexPTHREAD_MUTEX_INITIALIZER; 在LinuxThreads實現中&#xff0c;pthread_…

無效設備解決辦法

touch /etc/ini.d/FirstLoadkill 殺死槍彈柜程序 或重啟reboot轉載于:https://www.cnblogs.com/yygsj/p/5634384.html

HALCON示例程序measure_grid.hdev使用XLD分割鍵盤輪廓

HALCON示例程序measure_grid.hdev使用XLD分割鍵盤輪廓 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘keypad’) get_image_pointer1 (Image, Pointer, Type, Width, Height) dev_close_window () dev_open_window…

[BZOJ3992]序列統計

DP一下&#xff0c;設$f_{i,j}$表示生成$i$個數且乘積$\%Mj$的方案數&#xff0c;則$f_{i1,l}\sum\limits_{jk\%Ml}[k\in S]f_{i,j}$ 我們很不希望DP式中下標的位置出現乘法&#xff0c;因為這樣不好轉移&#xff0c;考慮把乘法換成加法 因為模數$M$是質數&#xff0c;所以它有…

socket,TCP/IP的理解(轉)

TCP/IP 要想理解socket首先得熟悉一下TCP/IP協議族&#xff0c; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;即傳輸控制協議/網間協議&#xff0c;定義了主機如何連入因特網及數據如何再它們之間傳輸的標準&#xff0c; 從字面意思來看TCP…

最小中間和

題目描述 給定一個正整數序列a1,a2,...,an&#xff0c;不改變序列中的每個元素在序列中的位置&#xff0c;把它們相加&#xff0c;并用括號記每次加法所得的和&#xff0c;稱為中間和。編程&#xff1a;找到一種方法&#xff0c;添上n-1對括號&#xff0c;加法運算依括號順序進…

HALCON示例程序measure_metal_part_extended.hdev金屬零件尺寸測量

HALCON示例程序measure_metal_part_extended.hdev金屬零件尺寸測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘metal-parts/metal-parts-01’) init_visualization (Image, 3, ‘white’, ‘margin’, Width, …

雙目匹配與視差計算

立體匹配主要是通過找出每對圖像間的對應關系&#xff0c;根據三角測量原理&#xff0c;得到視差圖&#xff1b;在獲得了視差信息后&#xff0c;根據投影模型很容易地可以得到原始圖像的深度信息和三維信息。立體匹配技術被普遍認為是立體視覺中最困難也是最關鍵的問題&#xf…

JavaEE 銀聯支付之網站支付-消費類交易

以銀聯網站支付 - 消費類交易 為例 0. 大致邏輯 前端request->后臺封裝參數->后臺進行簽名->生成跳轉頁面&#xff08;包含表單提交內容&#xff09;->響應前端&#xff08;將生成的html寫到瀏覽器中完成自動跳轉打開銀聯支付頁面&#xff09; 復制代碼1.acp_sdk.p…

react 開發知識準備

react react使用教程 babel babel 可用于ES6轉換為ES5&#xff0c;jsx轉換為原生js。 ES6 ES6 語法 webpack webpack打包工具&#xff0c;它把不同的、相互依賴的靜態資源都視作模塊&#xff0c;并且打包成我們想要的靜態資源。讓代碼組織更清晰&#xff0c;一個文件就是一個模…

Linux多線程編程(不限Linux)

——本文一個例子展開&#xff0c;介紹Linux下面線程的操作、多線程的同步和互斥。 前言 線程&#xff1f;為什么有了進程還需要線程呢&#xff0c;他們有什么區別&#xff1f;使用線程有什么優勢呢&#xff1f;還有多線程編程的一些細節問題&#xff0c;如線程之間怎樣同步、…

概率論與數理統計-ch8-假設檢驗

1、假設檢驗 在總體的分布函數未知或只知其形式、不知其參數的情況下&#xff0c;為了推斷總體的某些未知特性&#xff0c;提出關于總體的假設&#xff0c;然后根據樣本數據對提出的假設做出接受或拒絕的決策。 步驟&#xff1a; 提出原假設--確定建立在樣本基礎上的檢驗統計量…

HALCON示例程序measure_metal_part_first_example.hdev通過擬合邊緣進行尺寸測量

HALCON示例程序measure_metal_part_first_example.hdev通過擬合邊緣進行尺寸測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘metal-parts/metal-parts-01’) get_image_size (Image, Width, Height) dev_close…