maven根据操作系统的不同打包时引入不同的依赖(jar)

75 篇文章 2 订阅
15 篇文章 1 订阅

在进行java开发时经常遇到一种情况,就是windows下和linux下需要引入的jar包是不一样的。

比如说我们需要使用java来操作OpenGL库,我们就需要通过maven引入JOGL的依赖,

然而在window下和在linux下需要引入JOGL的依赖是不一样的:

  • window下,需要引入JOGL-win版本的依赖。
  • linux下,则需要引入JOGL-linux版本的依赖。

那么我们应该怎么做呢,如何灵活配置和指定不同环境的依赖呢,我们需要使用Maven配置文件中的 <profiles> 元素。

下面是一个常用的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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.xxx.xxx</groupId>
        <artifactId>xxx-xxx</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>xxx-xxx</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		...
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <finalName>${project.artifactId}</finalName>
                    <layers>
                        <enabled>true</enabled>
                    </layers>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

现在我需要操作OpenGL,在开发时是win环境(amd64),需要加入如下依赖:

	<dependency>
		<groupId>org.jogamp.jogl</groupId>
		<artifactId>jogl-all</artifactId>
		<version>2.3.2</version>
		<classifier>natives-linux-amd64</classifier>
	</dependency>
	<dependency>
		<groupId>org.jogamp.gluegen</groupId>
		<artifactId>gluegen-rt</artifactId>
		<version>2.3.2</version>
		<classifier>natives-linux-amd64</classifier>
	</dependency>

但是上生产的时候是运行在Linux上的,则需要将上述依赖改为Linux的,如下:

	<dependency>
		<groupId>org.jogamp.jogl</groupId>
		<artifactId>jogl-all</artifactId>
		<version>2.3.2</version>
		<classifier>natives-windows-amd64</classifier>
	</dependency>
	<dependency>
		<groupId>org.jogamp.gluegen</groupId>
		<artifactId>gluegen-rt</artifactId>
		<version>2.3.2</version>
		<classifier>natives-windows-amd64</classifier>
	</dependency>

那么如何通过maven的配置来指定使用哪个依赖呢,则需要使用 Maven 的Profiles,在pom中添加如下配置:

    <dependencies>
		...
    </dependencies>
    
    <profiles>
        <profile>
            <id>win</id>
            <properties>
                <profileActive>win</profileActive>
                <db.url>jdbc:mysql://localhost/win_db</db.url>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
                <!-- 根据属性值激活 -->
                <property>
                    <name>env</name>
                    <value>test</value>
                </property>
            </activation>
            <dependencies>
            	<dependency>
					<groupId>org.jogamp.jogl</groupId>
					<artifactId>jogl-all</artifactId>
					<version>2.3.2</version>
					<classifier>natives-windows-amd64</classifier>
				</dependency>
				<dependency>
					<groupId>org.jogamp.gluegen</groupId>
					<artifactId>gluegen-rt</artifactId>
					<version>2.3.2</version>
					<classifier>natives-windows-amd64</classifier>
				</dependency>
            </dependencies>
        </profile>
        <profile>
            <id>linux</id>
            <properties>
                <profileActive>linux</profileActive>
                <db.url>jdbc:mysql://localhost/linux_db</db.url>
            </properties>
            <activation>
                <activeByDefault>false</activeByDefault>
                 <!-- 根据属性值激活 -->
                <property>
                    <name>env</name>
                    <value>prd</value>
                </property>
            </activation>
            <dependencies>
                <dependency>
                    <groupId>org.jogamp.jogl</groupId>
                    <artifactId>jogl-all</artifactId>
                    <version>2.3.2</version>
                    <classifier>natives-linux-amd64</classifier>
                </dependency>
                <dependency>
                    <groupId>org.jogamp.gluegen</groupId>
                    <artifactId>gluegen-rt</artifactId>
                    <version>2.3.2</version>
                    <classifier>natives-linux-amd64</classifier>
                </dependency>
            </dependencies>
        </profile>
    </profiles>
  • <id> 元素:用于给 Profile 分配一个唯一的标识符,使用maven构建时,根据此id选择需要激活的环境。
  • <properties>元素:自定义的属性,不同的 Profile 被激活时,里面的配置将被设置为不同的值,在其他地方可以获取到并使用改属性,比如在资源文件中,使用 ${} 格式的占位符引用属性的值:
    profileActive=${profileActive}
    db.url=${db.url}
    
  • <activation> 元素 :定义了 Profile 的激活条件。
    • <activeByDefault>元素:表示是否默认激活,设置为 true,表示在没有明确指定其他 Profile 时,该配置将自动激活,可以使用命令mvn clean package -Pwinmvn clean package -Plinux来指定对应的profile id
    • <property>元素:根据属性 env 的值来激活,可以使用命令-Denv=test-Denv=prd来激活。
  • <dependencies>元素:该环境下对应的依赖。
  • <build>元素:该环境下的构建选项。
  • ......:其他元素,用处不多,不展开介绍。

正如上面所说,这时候在构建时就可以指定选项来打包不同的依赖了:

  1. 通过profile id打包:

    mvn clean package -Pwin
    
  2. 通过自定义环境变量打包:

    mvn clean package -Denv=test
    
### 回答1: Java项目中,jar是一种常见的依赖方式,而Maven则是一种更加高级的依赖管理工具。二者的不同主要在以下几个方面: 1. 依赖管理方式不同:使用jar方式,需要手动下载所需的jar,并将其添加到项目中;而使用Maven则可以在pom.xml文件中声明依赖Maven会自动下载所需的jar,并且可以管理依赖的版本、作用域等信息。 2. 依赖继承方式不同:使用jar方式,如果一个项目依赖于多个jar,需要手动处理这些jar之间的依赖关系;而使用Maven则可以通过父子模块的继承关系,让子模块自动继承父模块的依赖,避免了手动处理依赖关系的繁琐工作。 3. Maven提供了更多的功能:Maven不仅提供了依赖管理的功能,还可以进行构建、测试、打包、发布等操作,可以帮助开发人员更加高效地管理项目。 总之,使用Maven能够更加方便地管理项目的依赖,避免了手动下载和处理依赖关系的繁琐工作。但是,如果只是一个简单的项目,使用jar方式也是可以的。 ### 回答2: jar方式和Maven依赖方式是Java中两种不同的方式来引入和管理外部依赖。 首先,使用jar方式,我们需要手动将外部依赖jar下载并保存在本地,然后将这些jar添加到项目的classpath中。这种方式需要我们手动管理所有的依赖括版本控制和冲突解决,容易出现依赖冲突的问题。 而Maven依赖方式则通过在项目的pom.xml文件中声明所需的依赖Maven会自动从网络上下载这些依赖并保存在本地的仓库中。Maven还会根据依赖关系自动解决依赖冲突,并确保每个依赖库的正确版本。这种方式简化了依赖管理的过程,提供了更简单和可重复使用的项目构建和部署。 其次,使用jar方式,我们需要手动下载和添加所有的依赖,工作量较大。而Maven依赖方式使用集中的仓库管理依赖的下载和更新,极大地减轻了人工管理的负担。 此外,使用jar方式,项目中的所有依赖都需要手动管理,容易出现版本不一致的问题。而Maven依赖方式可以通过声明依赖到一个整体的项目管理系统,使得依赖的版本控制更加方便,减少了版本冲突的可能性,同也方便了团队协作和持续集成。 综上所述,Maven依赖方式相对于jar方式具有更加灵活和便捷的依赖管理方式,能够帮助我们更好地管理项目的依赖,提高开发效率。 ### 回答3: jar方式和Maven依赖方式是软件开发中常用的两种方式来管理和使用第三方库。它们有以下不同之处: 1. 管理方式不同: - Jar方式:开发人员需要手动下载第三方库的jar,并将其添加到项目的classpath中。这种方式需要手动处理版本冲突和依赖关系。 - Maven依赖方式:使用Maven作为项目管理工具,在项目的配置文件(pom.xml)中声明依赖关系,Maven会自动下载并管理所需的jarMaven会解决版本冲突,并递归处理所有的依赖关系。 2. 依赖管理: - Jar方式:需要手动下载和管理所有所需的jar括它们的版本兼容性。 - Maven依赖方式:只需在pom.xml中声明所需的依赖Maven会自动下载和管理所有的依赖。开发者只需关注需要的库,而不必担心版本兼容性和冲突问题。 3. 构建与部署: - Jar方式:需要手动将所有的依赖jar打包到可执行的jar文件中,然后手动部署到目标环境。 - Maven依赖方式:Maven会自动处理依赖并构建项目,生成可执行的jar文件。开发者只需使用Maven命令进行构建和部署,简化了整个过程。 4. 生态系统: - Jar方式:开发人员需要在不同的库的官方网站或其他公共资源库搜索和下载所需的jar。 - Maven依赖方式:Maven中央仓库是一个中央化的资源库,含了大量常用的库,开发者只需在配置文件中指定库的GAV(Group ID、Artifact ID、Version)信息,Maven会自动从中央仓库下载所需的库。 总体来说,Maven依赖方式相对于Jar方式更加方便和高效。它能够自动处理依赖关系、解决版本冲突,同提供了更简单的项目构建和部署流程,使开发者能够更专注于业务逻辑的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L-960

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值