我正在尝试用python制作我自己的自定义Minecraft启动器,并且我已经有了一个. minecraft文件夹。我对这个游戏非常熟悉,我想我想用Zulu OpenJDK和Iris mod制作一个自定义客户端,以优化性能。我正在尝试在. minecraft/version/1.16.5.jar
中启动jarfile,我不知道参数应该是什么。我能够获取播放器的uuid和accestoken。我正在查看1.16.5.json
文件(格式化),我不知道为natives_directory
和类路径
变量指定什么。有人能帮我吗?
(p. s.我在ubuntu linux上20.04 lts)
@Ofek发表了一条评论,提出了另一个问题,我发现@edwin的回答很有效。
以下是@edwin的代码:
import json
import os
import platform
from pathlib import Path
import subprocess
"""
Debug output
"""
def debug(str):
if os.getenv('DEBUG') != None:
print(str)
"""
[Gets the natives_string toprepend to the jar if it exists. If there is nothing native specific, returns and empty string]
"""
def get_natives_string(lib):
arch = ""
if platform.architecture()[0] == "64bit":
arch = "64"
elif platform.architecture()[0] == "32bit":
arch = "32"
else:
raise Exception("Architecture not supported")
nativesFile=""
if not "natives" in lib:
return nativesFile
if "windows" in lib["natives"] and platform.system() == 'Windows':
nativesFile = lib["natives"]["windows"].replace("${arch}", arch)
elif "osx" in lib["natives"] and platform.system() == 'Darwin':
nativesFile = lib["natives"]["osx"].replace("${arch}", arch)
elif "linux" in lib["natives"] and platform.system() == "Linux":
nativesFile = lib["natives"]["linux"].replace("${arch}", arch)
else:
raise Exception("Platform not supported")
return nativesFile
"""
[Parses "rule" subpropery of library object, testing to see if should be included]
"""
def should_use_library(lib):
def rule_says_yes(rule):
useLib = None
if rule["action"] == "allow":
useLib = False
elif rule["action"] == "disallow":
useLib = True
if "os" in rule:
for key, value in rule["os"].items():
os = platform.system()
if key == "name":
if value == "windows" and os != 'Windows':
elif value == "osx" and os != 'Darwin':
return useLib
elif value == "linux" and os != 'Linux':
return useLib
elif key == "arch":
if value == "x86" and platform.architecture()[0] != "32bit":
return useLib
return not useLib
if not "rules" in lib:
return True
shouldUseLibrary = False
for i in lib["rules"]:
if rule_says_yes(i):
return True
return shouldUseLibrary
"""
[Get string of all libraries to add to java classpath]
"""
def get_classpath(lib, mcDir):
cp = []
for i in lib["libraries"]:
if not should_use_library(i):
continue
libDomain, libName, libVersion = i["name"].split(":")
jarPath = os.path.join(mcDir, "libraries", *
libDomain.split('.'), libName, libVersion)
native = get_natives_string(i)
jarFile = libName + "-" + libVersion + ".jar"
if native != "":
jarFile = libName + "-" + libVersion + "-" + native + ".jar"
cp.append(os.path.join(jarPath, jarFile))
cp.append(os.path.join(mcDir, "versions", lib["id"], f'{lib["id"]}.jar'))
return os.pathsep.join(cp)
version = '1.16.5'
username = '<username>'
uuid = '<uuid>'
accessToken = '<accessToken>'
mcDir = os.path.join(os.getenv('HOME'), '.minecraft')
nativesDir = os.path.join(os.getenv('HOME'), 'versions', version, 'natives')
clientJson = json.loads(
Path(os.path.join(mcDir, 'versions', version, f'{version}.json')).read_text())
classPath = get_classpath(clientJson, mcDir)
mainClass = clientJson['mainClass']
versionType = clientJson['type']
assetIndex = clientJson['assetIndex']['id']
debug(classPath)
debug(mainClass)
debug(versionType)
debug(assetIndex)
subprocess.call([
'/usr/bin/java',
f'-Djava.library.path={nativesDir}',
'-Dminecraft.launcher.brand=custom-launcher',
'-Dminecraft.launcher.version=2.1',
'-cp',
classPath,
'net.minecraft.client.main.Main',
'--username',
username,
'--version',
version,
'--gameDir',
mcDir,
'--assetsDir',
os.path.join(mcDir, 'assets'),
'--assetIndex',
assetIndex,
'--uuid',
uuid,
'--accessToken',
accessToken,
'--userType',
'mojang',
'--versionType',
'release'
])
在spring boot,有一些在模式上的JAR。所有这些罐子都不包含任何包裹。它们有什么用? 在Maven POM中,添加了以下依赖项: org.springframework.boot:spring-boot-starter-web org.springframework.boot:spring-boot-starter-acture org.springframework.boot:spri
问题内容: 我已经通过安装了cron 由于未运行,尝试启动cron失败(按预期方式)。 正确启动cron的命令行是什么(即它将读取用户的crontabs,将读取/ etc / crontab / *等)? 请注意,我不想将容器作为“完整”机器启动,所以我不想运行或。我通过来管理进程,所以我缺少的是添加到其配置文件的命令行。 问题答案: 您可以在没有守护程序模式的情况下运行cron。 我只是想测试一
为了优化Docker层,我尝试将我们的30M Spring Boot fat jar拆分为2M应用程序。jar和2800万libs。罐子 我可以使用爆炸模式,但我更喜欢使用2罐,因为它简化了一些事情,如部署,脚本等。 我的问题是,当我把lib分离出来时,我无法让启动器找到它们。无论是在jar模式还是爆炸模式(有两个dir)下,我都会 我在以下所有情况下都会得到这个: 知道我怎么才能让它工作吗?
问题内容: 假设我的jar包“ com.test.io”中有一个名为test.txt的文件。 我将如何编写一个类来检索此文本文件,然后将内容复制到文件系统上的新文件中? 问题答案: 假设jar在您的类路径中:
问题内容: 我们有一个与已删除的某些需求相关的软件包,但我们不想删除该代码,因为将来可能会再次需要它。因此,在我们现有的ant构建中,我们只是将该包排除在了jar中之外。这些类由于我们还删除了它们的依赖关系而无法编译,因此它们不能包含在构建中。 我正在尝试模仿Gradle中的功能,如下所示: 即使使用上面的exclude调用(并且我也尝试过不带方括号的尝试),gradle仍在尝试编译类,这会导致编
问题内容: 我有一个罐子,里面装有两个主要的A类和B类。在清单中,我提到了A类。现在,我必须从同一jar执行classB。命令应该是什么。 我不喜欢做两个单独的罐子。 谢谢 问题答案: 这将完成工作: