由于特定情况,本机下有多个jdk,而JAVA_HOME又只有一个。

本人习惯在命令行下一个命令编译打包程序,如何解决这个问题? 研究了不少时间,得到了两个解决方案:

1.使用bat   --  非常烂,不是很建议,如果您是系统管理员则另当别论。因为我们都知道编写纯bat实在不是很愉快,bat的语法是反人类的,至少让程序员很看不惯

2.bat结合python --使用极少的bat结合python,实际就是在bat中调用python文件解决一些参数问题

两种方案都要求批处理的第一个参数必须是jdk版本,目前这个参数的值简化为 JDK17 或者其它值

如果不介意多打一些命令,就不要考虑后文内容。

一、maven项目中pom的build部分

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<release>17</release>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

注意jdk17中 compile部分使用release不需要使用source,target,但要继续用,好像也可以。

至于是否保留源码,看项目要求。

二、纯bat方案

在一个设置了path变量值的目录(例如 d:\dev\bat\)下创建文件maven.bat,内容如下:

@echo off
rem set s=AAA BBB CCC DDD EEE FFF ask=sssss
set s=%*
set t=%s% setlocal enableextensions enabledelayedexpansion
set /a result2
set /a q=0
set /a firstParam :loop
for /f "tokens=1*" %%a in ("%t%") do (
rem echo %%a
set t=%%b if !q! gtr 0 set result2=!result2!%%a
if !q! equ 0 (
ECHO 第一个参数:%%a 需要被忽略
set firstParam=%%a
)
set /a q=q+1
echo !q! %%a
)
if defined t goto :loop rem set /a q=q-1
echo 原来输入参数个数:%q%
rem set result2=!result2:~1,-1!
echo 第一个参数是:%firstParam%
echo 新参数字符串:!result2! if %firstParam%==jdk17 (
echo 您选择的是JDK17
goto chooseJDK17
) if %firstParam%==JDK17 (
echo 您选择的是JDK17
goto chooseJDK17
) SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_251
goto runMaven :chooseJDK17
SET JAVA_HOME=C:\Program Files\Java\jdk-17.0.1
goto runMaven :runMaven
mvn !result2!

maven JDK17 clean compile package install -Dmaven.skip.test=true

结果成功,具体略。

三、bat结合python

先写bat文件 new-maven.bat

python D:\soft\java\apache-maven-3.8.4-bin\bin\maven.py %*

然后是maven.py文件

import sys
import os
def main():
_maven(sys.argv); def _maven(args):
i=0
argQty=len(args);
newArgStr="";
jdkVersion=""
print(f"总的参数个数是:{argQty}")
for j in range(1,argQty):
if j==1:
jdkVersion=args[j];
else:
print(args[j])
newArgStr=newArgStr+" "+args[j] print(f"第一个参数{jdkVersion}表示JDK版本,真正的参数是:{newArgStr}")
setCmd=""
if (jdkVersion.lower()=="jdk17"):
setCmd="set JAVA_HOME=C:\Program Files\Java\jdk-17.0.1"
else:
setCmd="set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_251" print(f"执行新的bat命令:{setCmd}");
setCmd="cmd /c \""+setCmd+"& mvn "+newArgStr+"\"";
print(f"新构建命令是 {setCmd}")
os.system(setCmd); if __name__ == "__main__":
main()

new-maven JDK17 clean compile package install -Dmaven.skip.test=true

结果成功,具体略。

四、小结

1.作为程序员,bat要会,但是如果环境允许,还是不要用bat编写批处理脚本。同理在linux中也尽量可以把脚本语言调整为python

现在的linux系列的服务器,版本新一些的,一般可以默认安装python,所以写python脚本还是非常方便的。

如果是windows服务器,安装一个python也非常容易

2.bat和bash的语法实在很不友好,而且容易遗忘,远远不如写python程序来得直接

这里列出bat几点吐槽的地方:

a.处理命令行传参

b.字符串操作,幼稚,难记,看起来非常奇怪的语法

c.变量赋值  ,还要弄清楚什么延迟变量等奇怪的内容

d.条件语句,写复杂的if else if 简直要命

没有什么是特别好用。为什么微软会搞这种情况怪的语法?脑袋大概被砸了?炫技的充分性很足?

但如果脚本和这些没有太大关系,倒是不反对用bat或者bash写,例如这样的bat

mkdir test

dir test

jdk17+spring6下打jar包的更多相关文章

  1. 如何为libs目录下的jar包关联源代码

    以前,我们可以为lib目录下的jar包关联源代码,但是现在似乎不行了. 下面是一篇讲述此问题解决方法的文章: How to attach javadoc or sources to jars in l ...

  2. eclipse 下生成jar包

    eclipse 下生成jar包 第一:普通类导出jar包,我说的普通类就是指此类包含main方法,并且没有用到别的jar包. 1.在eclipse中选择你要导出的类或者package,右击,选择Exp ...

  3. Android Studio下导出jar包和aar包

    Android Studio下导出jar包和aar包 jar包和aar包的区别 步骤 1. 创建Android工程 创建工程比较简单,不错复述 2. 创建一个Library(Module) 创建了一个 ...

  4. maven 项目pom文件引入lib下的jar包

    <dependency> <groupId>abc</groupId> <artifactId>abc</artifactId> <v ...

  5. IDEA中将WEB-INF\lib下的Jar包添加到项目中

    打开Project Structure[可以使用快捷键:Ctrl+Alt+Shift+S]左侧选中Modules,在Dependecies中,点击右侧“+”号,选择JARS or directorie ...

  6. 既使用maven编译,又使用lib下的Jar包

    <build> <finalName>xxx</finalName> <plugins> <plugin> <groupId>o ...

  7. Windows/Linux下引用jar包,并用javac/java编译运行

    Windows/Linux下引用jar包,并用javac/java编译运行,有需要的朋友可以参考下. 1> Windows 假设要引用的jar放在D:/test目录下,名字为t1.jar, ja ...

  8. idea maven项目如何使用lib下得jar包

    在项目开发中,一般使用maven来管理项目,但有时还需要引用本地lib下的jar包 比如,中央仓库没有jar包.这时我们就需要引入lib下的jar包了. 1.首先在dependencies里加入本地j ...

  9. idea lib下有jar包但是仍然报错 找不到类

    现象: idea lib下有jar包但是仍然报错 找不到类 但是有个奇怪现象 同样的配置下项目在eclipse中可以正常编译 启动. package com.puhui.car.aspect; imp ...

  10. 解决maven无法加载本地lib/下的jar包问题(程序包XXX不存在)

    这次一个项目用到maven编译,我在本地开发的时候jar包都是放在WEB-INF/lib目录下,通过 BuildPath将jar包导入,然后用MyEclipse中的:maven package命令打成 ...

随机推荐

  1. Golang 与 JS 的字符串截取大同小异

    Golang 和 JS 的字符串截取都可以利用索引定位的方式. Golang: str := "abcdef" sub := str[1: 2] JS: const str = ' ...

  2. 2024 年最值得推荐的 7 个 Vue3 组件库

    你好,我是 Kagol. Vue 是一款易学易用,性能出色,适用场景丰富的渐进式 JavaScript 框架,深受广大开发者的喜爱,Vue3 更是推出了 Composition API,让逻辑复用更友 ...

  3. UWP 写入图片 Exif 信息

    本文告诉大家如何在 UWP 中,保存图片的时候,写入 Exif 信息,也就是如照片的 相机型号 制造商 光圈值等信息的写入 在 UWP 中,保存图片或照片需要用到图片编码器,在使用编码器写入前可以设置 ...

  4. SAP HANA计算视图

    Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. 越来越多的SAP用户正在将SAP HANA实施为现有SAP BW的基础和数据库. ...

  5. Solution Set - LCT

    A[洛谷P3690]维护一个森林,支持询问路径xor和,连边(已连通则忽略),删边(无边则忽略),改变点权. B[洛谷P3203]\(n\)个装置编号为\(0,...,n-1\),从\(i\)可以一步 ...

  6. Unity 热更--AssetBundle学习笔记 0.7

    AssetBundle AB包是什么? AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包. Unity中的AssetBundle系统是对资源管理的一种扩展,通过将资源分 ...

  7. 【2023微博签到爬虫】用python爬上千条m端微博签到数据

    一.爬取目标 大家好,我是 @马哥python说,一枚10年程序猿. 今天分享一期python爬虫案例,爬取目标是新浪微博的微博签到数据,字段包含: 页码,微博id,微博bid,微博作者,发布时间,微 ...

  8. golang url解析

    package main import "fmt" import "net/url" import "strings" func main( ...

  9. 关于Java Chassis 3的契约优先(API First)开发

    本文分享自华为云社区<Java Chassis 3技术解密:契约优先(API First)开发>,作者: liubao68. 契约优先(API First)开发是指应用程序开发过程中,将A ...

  10. 《最新出炉》系列入门篇-Python+Playwright自动化测试-45-鼠标操作-下篇

    1.简介 鼠标为我们使用电脑提供了很多方便,我们看到的东西就可以将鼠标移动过去进行点击就可以打开或者访问内容,当页面内容过长时,我们也可以使用鼠标滚轮来实现对整个页面内容的查看,其实playwrigh ...