maven打包可運行的jar包(包含依賴工程)


java程序用maven打包的時默認沒有加入依賴的jar包的,這是需要修改下pom文件,加入如下plugin

<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.app</groupId>
    <artifactId>services</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jdk.version>1.7</jdk.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.sword.wechat4j</groupId>
            <artifactId>wechat4j</artifactId>
            <version>1.2.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/wechat4j-1.2.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.app</groupId>
            <artifactId>base</artifactId>
            <version>1.0</version>
            <type>jar</type>  <!--引用本地工程-->
        </dependency>
    </dependencies>
    <build>
        <finalName>BaiGongServer</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <includeScope>compile</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                     <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>baigong.loganalysis.ExtractLog</mainClass>
                        </manifest>
                    </archive>
                    <!--過濾掉不希望包含在jar中的文件 -->
                    <excludes>
                        <exclude>${project.basedir}/xml/*</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

內置屬性(Maven預定義可以直接使用)

${basedir} 項目根目錄
${version}表示項目版本;
${project.basedir}同${basedir};
${project.version}表示項目版本,與${version}相同;
${project.build.directory} 構建目錄,缺省為target
${project.build.sourceEncoding}表示主源碼的編碼格式;
${project.build.sourceDirectory}表示主源碼路徑;
${project.build.finalName}表示輸出文件名稱;
${project.build.outputDirectory} 構建過程輸出目錄,缺省為target/classes

 

依賴項的作用域
在定義項目的依賴項的時候,我們可以通過scope來指定該依賴項的作用范圍。scope的取值有compile、runtime、test、provided、system和import。
compile:這是依賴項的默認作用范圍,即當沒有指定依賴項的scope時默認使用compile。compile范圍內的依賴項在所有情況下都是有效的,包括運行、測試和編譯時。
runtime:表示該依賴項只有在運行時才是需要的,在編譯的時候不需要。這種類型的依賴項將在運行和test的類路徑下可以訪問。
test:表示該依賴項只對測試時有用,包括測試代碼的編譯和運行,對於正常的項目運行是沒有影響的。
provided:表示該依賴項將由JDK或者運行容器在運行時提供,也就是說由Maven提供的該依賴項我們只有在編譯和測試時才會用到,而在運行時將由JDK或者運行容器提供。
system:當scope為system時,表示該依賴項是我們自己提供的,不需要Maven到倉庫里面去找。指定scope為system需要與另一個屬性元素systemPath一起使用,它表示該依賴項在當前系統的位置,使用的是絕對路徑。

 

二: 如果要引用本地工程(生產一個jar包),
1: 需要將本地工程A生產jar包,並且將生產的jar添加到本地倉庫;
工程A pom配置

<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>com.app</groupId>
    <artifactId>base</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <name>base</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>base</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

然后右鍵工程A,Run As -> Maven Clean , Maven Install ,如果不出錯,即可安裝到Maven本地倉庫中。

 

2: 在當前要引用的工程B中pom中添加dependency(如上)

用POM Editor 打開pom,

點擊 "Add",

 

然后既可以添加到pom中的dependency中

 

三:將本地的jar包安裝到本地庫中,

例如:將IKAnalyzer-5.0.jar 注冊到本地庫中

在IKAnalyzer-5.0.jar所在的目錄中執行cmd命令:
mvn install:install-file -DgroupId=com.lxbglib -DartifactId=IKAnalyzer -Dversion=5.0 -Dpackaging=jar -Dfile=IKAnalyzer-5.0.jar

其中: com.lxbglib 是自定義的groupId
然后在pom.xml 加入

<dependency>
      <groupId>com.lxbglib</groupId>
      <artifactId>IKAnalyzer</artifactId>
      <version>5.0</version>
</dependency>

 

手動打包源碼

mvn clean source:jar install
在項目根路徑下的target目錄也會有 finalName-source.jar ,並且本地倉庫就有了finalName-source.jar,

mvn source:jar
在項目根路徑下的target目錄也會有 finalName-source.jar

自動打包源碼

將打包源碼綁定在maven的某一個聲明周期中,在項目的pom文件中加入maven-source-plugin插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.0.1</version>
    <configuration>
        <attach>true</attach>
    </configuration>
    <executions>
        <execution>
            <phase>compile</phase> <!--指定綁定的聲明周期階段-->
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

 mvn命令如下:

mvn clean 把target目錄刪掉
mvn clean compile 編譯項目至target目錄
mvn clean package 編譯+打包 至target目錄
mvn clean install 編譯+打包 至target目錄 然后安裝到本地倉庫
mvn clean deploy 上傳jar包到遠程倉庫
mvn javadoc:jar 打包javadoc文檔
如果需要將源碼上傳到遠程倉庫,則需deploy,然后再在pom文件中配置遠程倉庫的地址等信息。
上述兩種方式原理相同,均是在聲明周期內觸發了source plugin插件。

 

Spring Boot 2.2.0項目報"Unknown"錯誤的解決

只需在項目的pom.xml中,將maven-jar-plugin 3.1.2降級為3.1.1即可消除Bug。

<properties>
     <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties> 

然后Maven更新項目,Unknown錯誤消失。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM