Maven實(shí)戰(zhàn)分析

1.文章介紹

本文是在沒(méi)有任何Maven使用經(jīng)驗(yàn)的基礎(chǔ)上边锁,通過(guò)查閱資料椎麦,實(shí)際項(xiàng)目操作記錄下學(xué)習(xí)日志拆座,并作為今后查閱的依據(jù)仙蛉。

2.干貨

1.什么是Maven笋敞?

本人在接觸JavaCpp前,沒(méi)有關(guān)注過(guò)Maven的任何相關(guān)知識(shí)荠瘪,因?yàn)榫幾g需要才開(kāi)始學(xué)習(xí)Maven的使用夯巷,本人自己理解Maven和gradle一樣都是定義配置,依賴(lài)哀墓,編譯等流程的管理工具趁餐。官方的定義為:Apache Maven是一個(gè)軟件項(xiàng)目管理和綜合工具±捍拢基于項(xiàng)目對(duì)象模型(POM)的概念后雷,Maven可以從一個(gè)中心資料片管理項(xiàng)目構(gòu)建,報(bào)告和文件。

2.Maven配置

默認(rèn)情況下臀突,Maven從Maven中央倉(cāng)庫(kù)下載所有依賴(lài)關(guān)系勉抓。但是,有些庫(kù)丟失在中央存儲(chǔ)庫(kù)候学,只有在Java.net或JBoss的儲(chǔ)存庫(kù)遠(yuǎn)程倉(cāng)庫(kù)中能找到琳状。

1. Java.net資源庫(kù)

添加Java.net遠(yuǎn)程倉(cāng)庫(kù)的詳細(xì)信息在“pom.xml”文件。

<project ...>
<repositories>
    <repository>
      <id>java.net</id>
      <url>https://maven.java.net/content/repositories/public/</url>
    </repository>
 </repositories>
</project>

2.JBoss Maven存儲(chǔ)庫(kù)

  1. 添加JBoss遠(yuǎn)程倉(cāng)庫(kù)的詳細(xì)信息在 “pom.xml” 文件中盒齿。
<project ...>
    <repositories>
      <repository>
    <id>JBoss repository</id>
    <url>http://repository.jboss.org/nexus/content/groups/public/</url>
      </repository>
    </repositories>
</project>

3.pom.xml實(shí)戰(zhàn)

要學(xué)會(huì)使用Maven念逞,最起碼的目標(biāo)應(yīng)該是會(huì)分析pom.xml文件的,其次是清楚的了解編譯边翁,打包翎承,安裝等Maven的生命周期。
下面對(duì)javacpp-presets項(xiàng)目做實(shí)戰(zhàn)分析:
首先是javacpp-presets目錄下的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.bytedeco</groupId>
  <artifactId>javacpp-presets</artifactId>
  <version>1.3</version>
  <packaging>pom</packaging>

  <name>JavaCPP Presets</name>
  <description>The missing bridge between Java and native C++ libraries</description>
  <url>http://bytedeco.org/javacpp-presets/</url>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0</url>
      <distribution>repo</distribution>
    </license>
    <license>
      <name>GNU General Public License (GPL) version 2, or any later version</name>
      <url>http://www.gnu.org/licenses/</url>
      <distribution>repo</distribution>
    </license>
    <license>
      <name>GPLv2 with Classpath exception</name>
      <url>http://www.gnu.org/software/classpath/license.html</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Samuel Audet</name>
      <email>samuel.audet@gmail.com</email>
    </developer>
  </developers>

  <modules>
    <module>opencv</module>
    <module>ffmpeg</module>
    <module>flycapture</module>
    <module>libdc1394</module>
    <module>libfreenect</module>
    <module>librealsense</module>
    <module>videoinput</module>
    <module>artoolkitplus</module>
    <module>chilitags</module>
    <module>flandmark</module>
    <module>hdf5</module>
    <module>openblas</module>
    <module>fftw</module>
    <module>gsl</module>
    <module>llvm</module>
    <module>leptonica</module>
    <module>tesseract</module>
    <module>caffe</module>
    <module>cuda</module>
    <module>mxnet</module>
    <module>tensorflow</module>
  </modules>

  <prerequisites>
    <maven>3.0</maven>
  </prerequisites>

  <scm>
    <url>https://github.com/bytedeco/javacpp-presets</url>
    <connection>scm:git:git://github.com/bytedeco/javacpp-presets.git</connection>
    <developerConnection>scm:git:ssh://git@github.com/bytedeco/javacpp-presets.git</developerConnection>
  </scm>

  <distributionManagement>
    <snapshotRepository>
      <id>sonatype-nexus-snapshots</id>
      <name>Sonatype Nexus Snapshots</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype-nexus-staging</id>
      <name>Sonatype Nexus Staging</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <javacpp.cppbuild.skip>false</javacpp.cppbuild.skip> <!-- To skip execution of cppbuild.sh: -Djavacpp.cppbuild.skip=true -->
    <javacpp.parser.skip>false</javacpp.parser.skip>     <!-- To skip header file parsing phase: -Djavacpp.parser.skip=true  -->
    <javacpp.compiler.skip>false</javacpp.compiler.skip> <!-- To skip native compilation phase: -Djavacpp.compiler.skip=true -->
    <javacpp.moduleId>${project.artifactId}</javacpp.moduleId>
    <javacpp.platform.android-arm>android-arm</javacpp.platform.android-arm>
    <javacpp.platform.android-x86>android-x86</javacpp.platform.android-x86>
    <javacpp.platform.linux-x86>linux-x86</javacpp.platform.linux-x86>
    <javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64>
    <javacpp.platform.linux-armhf>linux-armhf</javacpp.platform.linux-armhf>
    <javacpp.platform.linux-ppc64le>linux-ppc64le</javacpp.platform.linux-ppc64le>
    <javacpp.platform.macosx-x86_64>macosx-x86_64</javacpp.platform.macosx-x86_64>
    <javacpp.platform.windows-x86>windows-x86</javacpp.platform.windows-x86>
    <javacpp.platform.windows-x86_64>windows-x86_64</javacpp.platform.windows-x86_64>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp</artifactId>
        <version>${project.parent.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <finalName>${project.artifactId}</finalName>
    <pluginManagement>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>
          <execution>
            <id>javacpp.parser</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>resources</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
        <executions>
          <execution>
            <id>default-compile</id>
            <configuration>
              <includes>
                <include>org/bytedeco/javacpp/*.java</include>
              </includes>
            </configuration>
          </execution>
          <execution>
            <id>javacpp.parser</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <skipMain>${javacpp.parser.skip}</skipMain>
              <includes>
                <include>org/bytedeco/javacpp/presets/*.java</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp</artifactId>
        <version>${project.parent.version}</version>
        <configuration>
          <properties>${javacpp.platform}</properties>
          <propertyKeysAndValues>
            <property>
              <name>platform.root</name>
              <value>${javacpp.platform.root}</value>
            </property>
            <property>
              <name>platform.compiler</name>
              <value>${javacpp.platform.compiler}</value>
            </property>
          </propertyKeysAndValues>
          <classPath>${project.build.outputDirectory}</classPath>
          <includePath>${basedir}/cppbuild/${javacpp.platform}/include/</includePath>
          <linkPath>${basedir}/cppbuild/${javacpp.platform}/lib/</linkPath>
          <preloadPath>${basedir}/cppbuild/${javacpp.platform}/bin/</preloadPath>
        </configuration>
        <executions>
          <execution>
            <id>javacpp.parser</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>build</goal>
            </goals>
            <configuration>
              <skip>${javacpp.parser.skip}</skip>
              <outputDirectory>${project.build.sourceDirectory}</outputDirectory>
              <classOrPackageName>org.bytedeco.javacpp.presets.*</classOrPackageName>
            </configuration>
          </execution>
          <execution>
            <id>javacpp.compiler</id>
            <phase>process-classes</phase>
            <goals>
              <goal>build</goal>
            </goals>
            <configuration>
              <skip>${javacpp.compiler.skip}</skip>
              <classOrPackageName>org.bytedeco.javacpp.*</classOrPackageName>
              <copyLibs>true</copyLibs>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
          <execution>
            <id>default-jar</id>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <archive>
<!--                <manifest>                          -->
<!--                  <addClasspath>true</addClasspath> -->
<!--                </manifest>                         -->
                <manifestEntries>
                  <!-- <addClasspath/> is broken: http://jira.codehaus.org/browse/MJAR-61 -->
                  <Class-Path>. javacpp.jar</Class-Path>
                  <Name>org/bytedeco/javacpp/presets/</Name>
                  <Implementation-Title>${project.name}</Implementation-Title>
                  <Implementation-Vendor>Bytedeco</Implementation-Vendor>
                  <Implementation-Version>${project.version}</Implementation-Version>
                  <Specification-Title>${project.name}</Specification-Title>
                  <Specification-Vendor>Bytedeco</Specification-Vendor>
                  <Specification-Version>${project.version}</Specification-Version>
                </manifestEntries>
              </archive>
              <includes>
                <include>org/bytedeco/javacpp/*</include>
                <include>org/bytedeco/javacpp/helper/*</include>
                <include>org/bytedeco/javacpp/presets/*</include>
              </includes>
              <excludes>
                <exclude>org/bytedeco/javacpp/*.h</exclude>
                <exclude>org/bytedeco/javacpp/linux-*/</exclude>
                <exclude>org/bytedeco/javacpp/macosx-*/</exclude>
                <exclude>org/bytedeco/javacpp/windows-*/</exclude>
                <exclude>org/bytedeco/javacpp/${javacpp.platform}/</exclude>
              </excludes>
            </configuration>
          </execution>
          <execution>
            <id>${javacpp.platform}</id>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <classifier>${javacpp.platform}</classifier>
              <skipIfEmpty>true</skipIfEmpty>
              <includes>
                <include>${javacpp.platform.library.path}/</include>
                <include>org/bytedeco/javacpp/${javacpp.platform}/</include>
              </includes>
              <excludes>
                <exclude>**/*.exp</exclude>
                <exclude>**/*.lib</exclude>
                <exclude>**/*.obj</exclude>
              </excludes>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.2</version>
        <configuration>
          <createChecksum>true</createChecksum>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.0.1</version>
        <executions>
          <execution>
            <id>attach-source</id>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.10.4</version>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <links>
                <link>http://bytedeco.org/javacpp/apidocs/</link>
              </links>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.5.0</version>
        <executions>
          <execution>
            <id>javacpp.cppbuild.install</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>exec</goal>
            </goals>            
            <configuration>
              <arguments>
                <argument>${project.basedir}/../cppbuild.sh</argument>
                <argument>install</argument>
                <argument>${javacpp.moduleId}</argument>
                <argument>-platform</argument>
                <argument>${javacpp.platform}</argument>
              </arguments>
            </configuration>
          </execution>
          <execution>
            <id>javacpp.cppbuild.clean</id>
            <phase>clean</phase>
            <goals>
              <goal>exec</goal>
            </goals>            
            <configuration>
              <arguments>
                <argument>${project.basedir}/../cppbuild.sh</argument>
                <argument>clean</argument>
                <argument>${javacpp.moduleId}</argument>
              </arguments>
            </configuration>
          </execution>        
        </executions>
        <configuration>
          <skip>${javacpp.cppbuild.skip}</skip>
          <workingDirectory>${project.basedir}/..</workingDirectory>
          <executable>bash</executable>         
        </configuration>
      </plugin>
    </plugins>
    </pluginManagement>

    <plugins>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.2</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <version>1.6.6</version>
        <executions>
          <execution>
            <id>default-deploy</id>
            <phase>deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
          </execution>
        </executions>
        <extensions>true</extensions>
        <configuration>
          <serverId>sonatype-nexus-staging</serverId>
          <nexusUrl>https://oss.sonatype.org/</nexusUrl>
          <skipStagingRepositoryClose>true</skipStagingRepositoryClose>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>doclint-java8-disable</id>
      <activation>
        <jdk>[1.8,)</jdk>
      </activation>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
              <additionalparam>-Xdoclint:none</additionalparam>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

    <profile>
      <id>assembly</id>
      <modules>
        <module>platform</module>
      </modules>
    </profile>

    <profile>
      <id>sign-artifacts</id>
      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>1.6</version>
            <executions>
              <execution>
                <id>sign-artifacts</id>
                <phase>verify</phase>
                <goals>
                  <goal>sign</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <useAgent>false</useAgent>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

    <profile>
      <id>javacpp-platform-default</id>
      <activation>
        <property>
          <name>!javacpp.platform</name>
        </property>
      </activation>
      <properties>
        <javacpp.platform>${os.name}-${os.arch}</javacpp.platform>
      </properties>
    </profile>

    <profile>
      <id>javacpp-platform-custom</id>
      <activation>
        <property>
          <name>javacpp.platform</name>
        </property>
      </activation>
      <properties>
        <javacpp.platform.android-arm>${javacpp.platform}</javacpp.platform.android-arm>
        <javacpp.platform.android-x86>${javacpp.platform}</javacpp.platform.android-x86>
        <javacpp.platform.linux-x86>${javacpp.platform}</javacpp.platform.linux-x86>
        <javacpp.platform.linux-x86_64>${javacpp.platform}</javacpp.platform.linux-x86_64>
        <javacpp.platform.linux-armhf>${javacpp.platform}</javacpp.platform.linux-armhf>
        <javacpp.platform.linux-ppc64le>${javacpp.platform}</javacpp.platform.linux-ppc64le>
        <javacpp.platform.macosx-x86_64>${javacpp.platform}</javacpp.platform.macosx-x86_64>
        <javacpp.platform.windows-x86>${javacpp.platform}</javacpp.platform.windows-x86>
        <javacpp.platform.windows-x86_64>${javacpp.platform}</javacpp.platform.windows-x86_64>
      </properties>
    </profile>

    <profile>
      <id>javacpp-platform-host</id>
      <activation>
        <property>
          <name>javacpp.platform.host</name>
        </property>
      </activation>
      <properties>
        <javacpp.platform>${os.name}-${os.arch}</javacpp.platform>
        <javacpp.platform.android-arm>${os.name}-${os.arch}</javacpp.platform.android-arm>
        <javacpp.platform.android-x86>${os.name}-${os.arch}</javacpp.platform.android-x86>
        <javacpp.platform.linux-x86>${os.name}-${os.arch}</javacpp.platform.linux-x86>
        <javacpp.platform.linux-x86_64>${os.name}-${os.arch}</javacpp.platform.linux-x86_64>
        <javacpp.platform.linux-armhf>${os.name}-${os.arch}</javacpp.platform.linux-armhf>
        <javacpp.platform.linux-ppc64le>${os.name}-${os.arch}</javacpp.platform.linux-ppc64le>
        <javacpp.platform.macosx-x86_64>${os.name}-${os.arch}</javacpp.platform.macosx-x86_64>
        <javacpp.platform.windows-x86>${os.name}-${os.arch}</javacpp.platform.windows-x86>
        <javacpp.platform.windows-x86_64>${os.name}-${os.arch}</javacpp.platform.windows-x86_64>
      </properties>
    </profile>

    <profile>
      <id>javacpp-platform-none</id>
      <activation>
        <property>
          <name>javacpp.platform.none</name>
        </property>
      </activation>
      <properties>
        <javacpp.platform></javacpp.platform>
        <javacpp.platform.android-arm></javacpp.platform.android-arm>
        <javacpp.platform.android-x86></javacpp.platform.android-x86>
        <javacpp.platform.linux-x86></javacpp.platform.linux-x86>
        <javacpp.platform.linux-x86_64></javacpp.platform.linux-x86_64>
        <javacpp.platform.linux-armhf></javacpp.platform.linux-armhf>
        <javacpp.platform.linux-ppc64le></javacpp.platform.linux-ppc64le>
        <javacpp.platform.macosx-x86_64></javacpp.platform.macosx-x86_64>
        <javacpp.platform.windows-x86></javacpp.platform.windows-x86>
        <javacpp.platform.windows-x86_64></javacpp.platform.windows-x86_64>
      </properties>
    </profile>

    <!-- Provide convenient profiles to set commonly used paths for Android -->
    <profile>
      <id>android-arm-default</id>
      <activation>
        <property>
          <name>javacpp.platform</name>
          <value>android-arm</value>
        </property>
      </activation>
      <properties>
        <javacpp.platform>android-arm</javacpp.platform>
        <javacpp.platform.root>${user.home}/Android/android-ndk/</javacpp.platform.root>
        <javacpp.platform.compiler>toolchains/arm-linux-androideabi-4.9/prebuilt/${os.name}-${os.arch}/bin/arm-linux-androideabi-g++</javacpp.platform.compiler>
      </properties>
    </profile>
    <profile>
      <id>android-x86-default</id>
      <activation>
        <property>
          <name>javacpp.platform</name>
          <value>android-x86</value>
        </property>
      </activation>
      <properties>
        <javacpp.platform>android-x86</javacpp.platform>
        <javacpp.platform.root>${user.home}/Android/android-ndk/</javacpp.platform.root>
        <javacpp.platform.compiler>toolchains/x86-4.9/prebuilt/${os.name}-${os.arch}/bin/i686-linux-android-g++</javacpp.platform.compiler>
      </properties>
    </profile>

    <!-- If someone knows a better way to do this, please do let me know! -->
    <profile>
      <id>linux</id>
      <activation>
        <os><name>linux</name></os>
      </activation>
      <properties>
        <os.name>linux</os.name>
      </properties>
    </profile>
    <profile>
      <id>macosx</id>
      <activation>
        <os><name>mac os x</name></os>
      </activation>
      <properties>
        <os.name>macosx</os.name>
      </properties>
    </profile>
    <profile>
      <id>windows</id>
      <activation>
        <os><family>windows</family></os>
      </activation>
      <properties>
        <os.name>windows</os.name>
      </properties>
    </profile>
    <profile>
      <id>i386</id>
      <activation>
        <os><arch>i386</arch></os>
      </activation>
      <properties>
        <os.arch>x86</os.arch>
      </properties>
    </profile>
    <profile>
      <id>i486</id>
      <activation>
        <os><arch>i486</arch></os>
      </activation>
      <properties>
        <os.arch>x86</os.arch>
      </properties>
    </profile>
    <profile>
      <id>i586</id>
      <activation>
        <os><arch>i586</arch></os>
      </activation>
      <properties>
        <os.arch>x86</os.arch>
      </properties>
    </profile>
    <profile>
      <id>i686</id>
      <activation>
        <os><arch>i686</arch></os>
      </activation>
      <properties>
        <os.arch>x86</os.arch>
      </properties>
    </profile>
    <profile>
      <id>amd64</id>
      <activation>
        <os><arch>amd64</arch></os>
      </activation>
      <properties>
        <os.arch>x86_64</os.arch>
      </properties>
    </profile>
    <profile>
      <id>x86-64</id>
      <activation>
        <os><arch>x86-64</arch></os>
      </activation>
      <properties>
        <os.arch>x86_64</os.arch>
      </properties>
    </profile>
  </profiles>

</project>

pom.xml分析:
a>基本配置

  <!--pom模型版本符匾,maven2和3只能為4.0.0-->
  <modelVersion>4.0.0</modelVersion> 
  <!--組ID叨咖,maven用于定位-->
  <groupId>org.bytedeco</groupId>
  <!--在組中的唯一ID用于定位-->
  <artifactId>javacpp-presets</artifactId>
  <!--項(xiàng)目版本-->
  <version>1.3</version>
  <!--項(xiàng)目打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par-->
  <packaging>pom</packaging>

licenses啊胶,developers分別是證書(shū)和開(kāi)發(fā)者的信息甸各。

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0</url>
      <distribution>repo</distribution>
    </license>
    <license>
      <name>GNU General Public License (GPL) version 2, or any later version</name>
      <url>http://www.gnu.org/licenses/</url>
      <distribution>repo</distribution>
    </license>
    <license>
      <name>GPLv2 with Classpath exception</name>
      <url>http://www.gnu.org/software/classpath/license.html</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Samuel Audet</name>
      <email>samuel.audet@gmail.com</email>
    </developer>
  </developers>

b>modules
有些maven項(xiàng)目會(huì)做成多模塊的,這個(gè)標(biāo)簽用于指定當(dāng)前項(xiàng)目所包含的所有模塊焰坪。之后對(duì)這個(gè)項(xiàng)目進(jìn)行的maven操作趣倾,會(huì)讓所有子模塊也進(jìn)行相同操作。

<modules>
    <module>opencv</module>
    <module>ffmpeg</module>
    <module>flycapture</module>
    <module>libdc1394</module>
    ...
</modules>

c>prerequisites
項(xiàng)目構(gòu)建的前提

  <prerequisites>
    <maven>3.0</maven>
  </prerequisites>

d>scm
允許你配置你的代碼庫(kù)某饰,供Maven web站點(diǎn)和其它插件使用

  <scm>
    <url>https://github.com/bytedeco/javacpp-presets</url>
    <connection>scm:git:git://github.com/bytedeco/javacpp-presets.git</connection>
    <developerConnection>scm:git:ssh://git@github.com/bytedeco/javacpp-presets.git</developerConnection>
  </scm>

e>properties
用于定義pom常量,定義的常量可以在pom文件的任意地方通過(guò)${key}來(lái)引用

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <javacpp.cppbuild.skip>false</javacpp.cppbuild.skip> <!-- To skip execution of cppbuild.sh: -Djavacpp.cppbuild.skip=true -->
    <javacpp.parser.skip>false</javacpp.parser.skip>     <!-- To skip header file parsing phase: -Djavacpp.parser.skip=true  -->
    <javacpp.compiler.skip>false</javacpp.compiler.skip> <!-- To skip native compilation phase: -Djavacpp.compiler.skip=true -->
    <javacpp.moduleId>${project.artifactId}</javacpp.moduleId>
    <javacpp.platform.android-arm>android-arm</javacpp.platform.android-arm>
    <javacpp.platform.android-x86>android-x86</javacpp.platform.android-x86>
    <javacpp.platform.linux-x86>linux-x86</javacpp.platform.linux-x86>
    ...
</properties>

比如可以${javacpp.platform.android-arm}引用android-arm

f>dependencyManagement
在父模塊中定義后儒恋,子模塊不會(huì)直接使用對(duì)應(yīng)依賴(lài),但是在使用相同依賴(lài)的時(shí)候可以不加版本號(hào):

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp</artifactId>
        <version>${project.parent.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

g>build

  <build>
    <!--產(chǎn)生的構(gòu)件的文件名黔漂,默認(rèn)值是${artifactId}-${version}诫尽。-->    
    <finalName>${project.artifactId}</finalName>
    <!--子項(xiàng)目可以引用的默認(rèn)插件信息。該插件配置項(xiàng)直到被引用時(shí)才會(huì)被解析或綁定到生命周期炬守。給定插件的任何本地配置都會(huì)覆蓋這里的配置-->    
    <pluginManagement>
    <!--使用的插件列表 牧嫉。-->
    <plugins>
      <!--plugin元素包含描述插件所需要的信息。-->  
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <!--在構(gòu)建生命周期中執(zhí)行一組目標(biāo)的配置减途。每個(gè)目標(biāo)可能有不同的配置酣藻。-->     
        <executions>
          <!--execution元素包含了插件執(zhí)行需要的信息--> 
          <execution>
            <!--執(zhí)行目標(biāo)的標(biāo)識(shí)符,用于標(biāo)識(shí)構(gòu)建過(guò)程中的目標(biāo)观蜗,或者匹配繼承過(guò)程中需要合并的執(zhí)行目標(biāo)-->
            <id>javacpp.parser</id>
            <!--綁定了目標(biāo)的構(gòu)建生命周期階段臊恋,如果省略,目標(biāo)會(huì)被綁定到源數(shù)據(jù)里配置的默認(rèn)階段-->  
            <phase>generate-sources</phase>
            <!--配置的執(zhí)行目標(biāo)-->  
            <goals>
              <goal>resources</goal>
            </goals>
         </execution>
        </executions>
      </plugin>
  ...

h>profiles
profile可以讓我們定義一系列的配置信息(插件等)墓捻,然后指定其激活條件

 <profiles>
    <profile>
      <id>doclint-java8-disable</id>
      <activation>
        <jdk>[1.8,)</jdk>
      </activation>
      <build>
        <plugins>
          <plugin>
  ...

例如,可以選擇其中的某一個(gè)模塊某一個(gè)目標(biāo)版本編譯:
模塊根據(jù)module的定義選取:
--projects xxx

  <modules>
    <module>opencv</module>
    <module>ffmpeg</module>

目標(biāo)版本根據(jù)profiles的定義來(lái)選茸┑凇:
-Pxxxx

 <profile>
      <id>android-arm-default</id>
      <activation>
        <property>
          <name>javacpp.platform</name>
          <value>android-arm</value>
        </property>
      </activation>
      <properties>
        <javacpp.platform>android-arm</javacpp.platform>
        <javacpp.platform.root>${user.home}/Android/android-ndk/</javacpp.platform.root>
        <javacpp.platform.compiler>toolchains/arm-linux-androideabi-4.9/prebuilt/${os.name}-${os.arch}/bin/arm-linux-androideabi-g++</javacpp.platform.compiler>
      </properties>
    </profile>

建議編譯時(shí)帶上-X打開(kāi)編譯開(kāi)關(guān)撤卢,可以很清楚的看到所有編譯配置的屬性值:
mvn install -Pandroid-arm-default --projects ffmpeg -X

root@yang:/home/yang/share/javacpp-presets1.3# mvn install -Pandroid-arm-default --projects ffmpeg -X
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.7.0_45, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java/jdk1.7.0_45/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-21-generic", arch: "amd64", family: "unix"
...
[INFO] Inspecting build with total of 1 modules...
[INFO] Not installing Nexus Staging features:
[INFO]  * Preexisting staging related goal bindings found in 1 modules.
[DEBUG] === REACTOR BUILD PLAN ================================================
[DEBUG] Project: org.bytedeco.javacpp-presets:ffmpeg:jar:3.2.1-1.3
[DEBUG] Tasks:   [install]
[DEBUG] Style:   Regular
[DEBUG] =======================================================================
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building JavaCPP Presets for FFmpeg 3.2.1-1.3
...
[DEBUG] === PROJECT BUILD PLAN ================================================
[DEBUG] Project:       org.bytedeco.javacpp-presets:ffmpeg:3.2.1-1.3
[DEBUG] Dependencies (collect): []
[DEBUG] Dependencies (resolve): [compile, runtime, test]
[DEBUG] Repositories (dependencies): [central (https://repo.maven.apache.org/maven2, default, releases)]
[DEBUG] Repositories (plugins)     : [central (https://repo.maven.apache.org/maven2, default, releases)]
[DEBUG] -----------------------------------------------------------------------
[DEBUG] Goal:          org.codehaus.mojo:exec-maven-plugin:1.5.0:exec (javacpp.cppbuild.install)
[DEBUG] Style:         Regular
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <arguments>
    <argument>/home/yang/share/javacpp-presets1.3/ffmpeg/../cppbuild.sh</argument>
    <argument>install</argument>
    <argument>ffmpeg</argument>
    <argument>-platform</argument>
    <argument>android-arm</argument>
  </arguments>
  <async default-value="false">${exec.async}</async>
  <asyncDestroyOnShutdown default-value="true">${exec.asyncDestroyOnShutdown}</asyncDestroyOnShutdown>
  <basedir default-value="${basedir}"/>
  <classpathScope default-value="runtime">${exec.classpathScope}</classpathScope>
  <commandlineArgs>${exec.args}</commandlineArgs>
  <executable>bash</executable>
  <longClasspath default-value="false">${exec.longClasspath}</longClasspath>
  <outputFile>${exec.outputFile}</outputFile>
  <project default-value="${project}"/>
  <session default-value="${session}"/>
  <skip default-value="false">false</skip>
  <sourceRoot>${sourceRoot}</sourceRoot>
  <testSourceRoot>${testSourceRoot}</testSourceRoot>
  <toolchain default-value="jdk">${exec.toolchain}</toolchain>
  <workingDirectory>/home/yang/share/javacpp-presets1.3/ffmpeg/..</workingDirectory>
</configuration>
...

然后是javacpp-presets/ffmpeg目錄下的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacpp-presets</artifactId>
    <version>1.3</version>
  </parent>

  <groupId>org.bytedeco.javacpp-presets</groupId>
  <artifactId>ffmpeg</artifactId>
  <version>3.2.1-${project.parent.version}</version>
  <name>JavaCPP Presets for FFmpeg</name>

  <dependencies>
    <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>javacpp</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-source-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-javadoc-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>mingw</id>
      <activation>
        <os><family>windows</family></os>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <configuration>
              <properties>${javacpp.platform}-mingw</properties>
              <compilerOptions>
                <compilerOption>-static-libgcc</compilerOption>
                <compilerOption>-static-libstdc++</compilerOption>
                <compilerOption>-Wl,-Bstatic</compilerOption>
                <compilerOption>-lstdc++</compilerOption>
                <compilerOption>-lgcc</compilerOption>
                <compilerOption>-lgcc_eh</compilerOption>
                <compilerOption>-lpthread</compilerOption>
                <compilerOption>-Wl,-Bdynamic</compilerOption>
              </compilerOptions>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>

和根節(jié)點(diǎn)pom.xml中不一樣的就是<parent>節(jié)點(diǎn):

key describe
groupId 父項(xiàng)目的構(gòu)件標(biāo)識(shí)符
artifactId 父項(xiàng)目的唯一標(biāo)識(shí)符
relativePath Maven首先在當(dāng)前項(xiàng)目的找父項(xiàng)目的pom,然后在文件系統(tǒng)的這個(gè)位置(relativePath)梧兼,然后在本地倉(cāng)庫(kù)放吩,再在遠(yuǎn)程倉(cāng)庫(kù)找。
version 父項(xiàng)目的版本

分析以上兩個(gè)pom.xml羽杰,可以基本了解javacpp ffmpeg編譯配置渡紫。
補(bǔ)一張javacpp ffmpeg編譯圖:


javacpp ffmpeg編譯結(jié)果

對(duì)于JavaCpp的FFMPEG編譯不屬于本文范疇,我會(huì)另外寫(xiě)一篇文章專(zhuān)門(mén)介紹考赛,有興趣的同學(xué)可以關(guān)注惕澎。

3.結(jié)束語(yǔ)

本人是帶著很強(qiáng)的目的性來(lái)學(xué)習(xí)Maven的使用的,最基本的目標(biāo)是根據(jù)配置好的pom.xml編譯出JavaCpp的FFMPEG庫(kù)(so,jar)颜骤,本文也是基于這個(gè)目標(biāo)記錄的唧喉,或許還達(dá)不到很多同學(xué)的學(xué)習(xí)目的也解決不了實(shí)際問(wèn)題,僅以此文作為自己查閱的資料吧忍抽,如有好的學(xué)習(xí)資料的實(shí)踐經(jīng)驗(yàn)八孝,也請(qǐng)告訴我,一起進(jìn)步鸠项,非常感謝干跛!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祟绊,隨后出現(xiàn)的幾起案子驯鳖,更是在濱河造成了極大的恐慌,老刑警劉巖久免,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浅辙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阎姥,警方通過(guò)查閱死者的電腦和手機(jī)记舆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呼巴,“玉大人泽腮,你說(shuō)我怎么就攤上這事∫赂希” “怎么了诊赊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)府瞄。 經(jīng)常有香客問(wèn)我碧磅,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任鲸郊,我火速辦了婚禮丰榴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秆撮。我一直安慰自己四濒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布职辨。 她就那樣靜靜地躺著盗蟆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舒裤。 梳的紋絲不亂的頭發(fā)上喳资,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音惭每,去河邊找鬼骨饿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛台腥,可吹牛的內(nèi)容都是我干的宏赘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黎侈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼察署!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起峻汉,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贴汪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后休吠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扳埂,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年瘤礁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阳懂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奶稠,到底是詐尸還是另有隱情,我是刑警寧澤号枕,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站陨享,受9級(jí)特大地震影響葱淳,放射性物質(zhì)發(fā)生泄漏钝腺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一蛙紫、第九天 我趴在偏房一處隱蔽的房頂上張望拍屑。 院中可真熱鬧途戒,春花似錦坑傅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至星爪,卻和暖如春浆西,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顽腾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工近零, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抄肖。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓久信,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親漓摩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裙士,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Maven 網(wǎng)址 Maven 官方網(wǎng)站,官方網(wǎng)站有關(guān)于 Maven 的一切管毙。Maven 百度百科 Maven 是什...
    被稱(chēng)為L(zhǎng)的男人閱讀 33,827評(píng)論 3 16
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理腿椎,服務(wù)發(fā)現(xiàn),斷路器夭咬,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,803評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,074評(píng)論 25 707
  • 本次學(xué)習(xí)內(nèi)容: 目標(biāo)詞匯: 復(fù)習(xí)課本第8頁(yè)“情緒”的基本表達(dá): "happy, angry, tired, s...
    TimmySHENX閱讀 266評(píng)論 0 0