记录【jar包运行不了,java多版本选择困难,jar打开方式无java】

记录【jar包运行不了,java多版本选择困难,jar打开方式无java】

前言

参考文章:链接: 记录jar包运行不了,注册表 javaw.exe\shell\open\command 路径找不到问题
1.jar包运行不了:多半是jar文件打开方式没关联到java
2.jar运行多版本选择:打开方式只会显示“Java™ Platform SE binary”

效果展示

右键显示各种java打开版本,并且版本号是java运行的真实版本
在这里插入图片描述

过程原理讲解

给他一个java路径,剩下交给代码
代码先着java.exe文件,然后执行java -version来获取对应的版本,然后写入jar文件打开方式,在修改打开方式里面java的描述

1 2 3~上连接

github: link

直接上代码

改写的注释我写了,没写的就是懒,copy我的代码请标明出处,谢谢

import shutil
import winreg
import os
import subprocess

# 定义用于获取注册表值的函数
def getzcb(HKEY, path, z=''):
    try:
        with winreg.OpenKey(HKEY, path) as key:
            try:
                return True, winreg.QueryValueEx(key, z)
            except FileNotFoundError:
                return True, ''
    except FileNotFoundError:
        print(f"注册表项不存在")
        return False, ''
    except PermissionError:
        print("没有足够的权限访问注册表")
        return False, ''

# 定义用于设置注册表值的函数
def setzcb(HKEY, path, j='', z='',l=winreg.REG_SZ):
    try:
        with winreg.CreateKey(HKEY, path) as key:
            try:
                winreg.SetValueEx(key, j, 0, l, z)
                print("值已写入注册表")
            except FileNotFoundError:
                return True, ''
    except FileNotFoundError:
        print(f"注册表项不存在")
        return False, ''
    except PermissionError:
        print("没有足够的权限访问注册表")
        return False, ''

# 定义要操作的注册表键和路径
HKEY = winreg.HKEY_LOCAL_MACHINE
path = r'SOFTWARE\Classes\jarfile'
# 获取计算机上的所有JDK目录
jdk=input('全部jdk目录:')
ml = [f1 for f1 in os.listdir(jdk) if (os.path.isdir(f'{jdk}\\{f1}') and f1.startswith('jdk-'))]
# 遍历每个JDK目录并执行以下操作
for f1 in ml:
    if not os.path.isfile(f'{jdk}\\{f1}\\bin\\java.exe'):
        print('无java.exe文件')
        exit
    # 获取JDK版本号
    bb1 = subprocess.getoutput(f'{jdk}\\{f1}\\bin\\java.exe -version').split('\n')[0][:-1].split('"')[1]
    bb=bb1.split('.')
    if bb[0] == '1':
        bb = bb[1]
    else:
        bb = bb[0]
    # 复制java.exe文件到j{版本号}.exe
    shutil.copyfile(f'{jdk}\\{f1}\\bin\\java.exe',f'{jdk}\\{f1}\\bin\\j{bb}.exe')
    # 操作注册表来关联.jar文件的打开方式
    if getzcb(winreg.HKEY_LOCAL_MACHINE, rf'SOFTWARE\Classes\jarfile{bb}')[0]:
        getzcb(HKEY, rf'SOFTWARE\Classes\jarfile{bb}')
        setzcb(HKEY, rf'SOFTWARE\Classes\jarfile{bb}', j='', z=f'可执行 Jar-{bb} 文件')
        getzcb(HKEY, rf'SOFTWARE\Classes\jarfile{bb}\shell\open\command')
        setzcb(HKEY, rf'SOFTWARE\Classes\jarfile{bb}\shell\open\command', j='', z=rf'{jdk}\{f1}\bin\j{bb}.exe -jar "%1" %*')
    else:
        setzcb(HKEY, rf'SOFTWARE\Classes\jarfile{bb}', j='', z=f'可执行 Jar-{bb} 文件')
        setzcb(HKEY, rf'SOFTWARE\Classes\jarfile{bb}\shell\open\command', j='', z=rf'{jdk}\{f1}\bin\j{bb}.exe -jar "%1" %*')
    # 设置其他相关注册表项
    setzcb(winreg.HKEY_USERS, rf'S-1-5-21-1738001706-3578771923-927531698-1001\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jar\OpenWithProgids', j=f'jarfile{bb}', z=b'',l=winreg.REG_BINARY)
    setzcb(winreg.HKEY_USERS, rf'S-1-5-21-1738001706-3578771923-927531698-1001\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache', j=f'{jdk}\\{f1}\\bin\\j{bb}.exe.FriendlyAppName', z=f'java-{bb1}',l=winreg.REG_SZ)
input('完成,回车结束')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

米汤爱学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值