为了自动构建签名APK,我还有一个PS1脚本,它应该使用命令行MSBUILD编译同一个应用程序。我设置JAVA_HOME,JDK_HOMEJDK 1.8。但是MSBUILD仍然使用JDK 1.7。我得到错误“不支持的类版本号52......”
在从命令行调用MSBUILD时,有没有一种方法可以设置JDK位置?
更令人困惑的是,这台机器上的默认Java版本是1.8(如果我键入Java-version,我会得到JDK1.8.0111)
更新当使用详细的登录执行构建时,我可以确认Xamarin看到JDK 1.8
ResolveSdksTask Outputs:
AndroidApiLevel: 25
AndroidApiLevelName: 25
AndroidNdkPath: D:\Users\milan\Documents\Android\ndk\android-ndk-r10e
AndroidSdkBuildToolsPath: D:\Utilities\android-sdk\build-tools\25.0.0
AndroidSdkBuildToolsBinPath: D:\Utilities\android-sdk\build-tools\25.0.0
AndroidSdkPath: D:\Utilities\android-sdk
JavaSdkPath: C:\Program Files\Java\jdk1.8.0_111
MonoAndroidBinPath: C:\Program Files (x86)\MSBuild\Xamarin\Android
MonoAndroidToolsPath: C:\Program Files (x86)\MSBuild\Xamarin\Android
MonoAndroidIncludePath:
TargetFrameworkVersion: v7.0
ZipAlignPath: D:\Utilities\android-sdk\build-tools\25.0.0
SupportedApiLevel: 24
AndroidSequencePointsMode: None
Found Android SDK. API levels: 10, 15, 19, 21, 22, 23, 24
但稍后的任务“AdjustJavacVersionArguments”将Javac版本更改为1.7:
Task "AdjustJavacVersionArguments"
ToolPath: C:\Program Files\Java\jdk1.8.0_111\\bin
ToolExe: javac.exe
EnableProguard: False
EnableMultiDex: True
Javac TargetVersion adjusted to: 1.7
Javac SourceVersion adjusted to: 1.7
Done executing task "AdjustJavacVersionArguments".
有什么想法吗?
这看起来是一系列问题的结合。
1)Multidex无法创建主列表,原因是API 24(Android 7.0)不支持JDK 1.7。
CREATEMULTIDEXMAINDEXCLASSLIST : error : Can't read [C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v7.0\mono.android.jar] (Can't process class [android/app/ActivityTracker.class] (Unsupported class version number [52.0] (maximum 51.0, Java 1.7))) [D:\src\anqueto\trunk\que\mikonboard.que.androidClient\mikonboard.que.androidClient.csproj]
也相关:Xamarin。Android ProGuard-不支持的类版本号52.0
2)javac
正在调整到JDK 1.7(因此您仍然安装了它)。
以下是已反编译的任务:
public class AdjustJavacVersionArguments : ToolTask
{
[Required]
public new string ToolPath { get; set; }
public bool EnableProguard { get; set; }
public bool EnableMultiDex { get; set; }
[Output]
public string TargetVersion { get; set; }
[Output]
public string SourceVersion { get; set; }
protected override string ToolName
{
get
{
return !OS.IsWindows ? "javac" : "javac.exe";
}
}
public override bool Execute()
{
this.Log.LogDebugMessage("ToolPath: {0}", (object) this.ToolPath);
this.Log.LogDebugMessage("ToolExe: {0}", (object) this.ToolExe);
this.Log.LogDebugMessage("EnableProguard: {0}", (object) this.EnableProguard);
this.Log.LogDebugMessage("EnableMultiDex: {0}", (object) this.EnableMultiDex);
if (!this.EnableProguard && !this.EnableMultiDex)
return true;
Process process = Process.Start(new ProcessStartInfo(Path.Combine(this.ToolPath, this.ToolExe ?? this.ToolName), "-version")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
});
process.WaitForExit();
string str1 = process.StandardError.ReadLine();
if (!str1.StartsWith("javac ") || !str1.Substring(6).StartsWith("1.8"))
return true;
string str2 = "1.7";
this.SourceVersion = str2;
this.TargetVersion = str2;
this.Log.LogDebugMessage("Javac TargetVersion adjusted to: {0}", (object) this.TargetVersion);
this.Log.LogDebugMessage("Javac SourceVersion adjusted to: {0}", (object) this.SourceVersion);
return true;
}
protected override string GenerateFullPathToTool()
{
return Path.Combine(this.ToolPath, this.ToolExe);
}
}
它看起来特别像是未能在以下行中返回true;
string str1 = process.StandardError.ReadLine();
if (!str1.StartsWith("javac ") || !str1.Substring(6).StartsWith("1.8"))
return true;
因此,它调整为1.7
:
string str2 = "1.7";
this.SourceVersion = str2;
this.TargetVersion = str2;
this.Log.LogDebugMessage("Javac TargetVersion adjusted to: {0}", (object) this.TargetVersion);
this.Log.LogDebugMessage("Javac SourceVersion adjusted to: {0}", (object) this.SourceVersion);
return true;
我想说,卸载JDK1.7可能是最容易的,只安装JDK1.8,看看这是否能解决您的问题。
否则,请确保项目和JDK在同一个驱动器上。您的C:\和D:\
驱动器上似乎都有零碎的部分。我会把你所有的开发工具放在一个驱动器上。
我有一个Android项目,其中一些Java源文件是使用命令行工具自动生成的。 如何在Gradle脚本中包含此命令,以便在构建应用程序时执行?
问题内容: 我必须将一些常规代码发送给仅安装了Java的某些用户(没有常规,没有$ groovy_home等)。我正在尝试从命令行调用Groovy,但是我没有运气。这是我的蝙蝠文件: 这是我的例外: 有人有线索吗?我在\ lib目录中有’groovy-all-1.6-beta-1.jar’。 问题答案: 我认为您需要在类路径中明确列出groovy jar
我试图调用cmd命令从Java使用进程构建器。然而,我面临的问题很少。 > 这个程序有时没有给出正确的输出。如果我使用process.destroy()方法并得到exitValue,它显示1。如果我注释掉process.destroy()方法,异常出现,进程没有退出。我猜可能是线程竞争条件。但是,没有process.waitFor()的影响。它有时仍然会产生错误的输出。我们如何测试这些情况并找出问
问题内容: 我正在尝试使用重定向和管道从Java执行一些Linux命令。Java如何调用或命令? 我试图用这个: 但是它与重定向或管道不兼容。 问题答案: 在你的shell中不执行命令 尝试 代替。 编辑::我的系统上没有,所以我改用。以下为我工作
本文向大家介绍Electron 调用命令行(cmd),包括了Electron 调用命令行(cmd)的使用技巧和注意事项,需要的朋友参考一下 因为最近的项目需求,需要在 Electron 客户端启动的时候启动 nginx 服务,所以研究了一下怎么在 Electron 调用 命令行。 因为 Electron 基于 Chromium 和 Node.js,可以直接使用 Node.js 的 API 和一些包
outputs/exec 插件的运用也非常简单,如下所示,将 logstash 切割成的内容作为参数传递给命令。这样,在每个事件到达该插件的时候,都会触发这个命令的执行。 output { exec { command => "sendsms.pl \"%{message}\" -t %{user}" } } 需要注意的是。这种方式是每次都重新开始执行一次命令并退