当前位置: 首页 > 知识库问答 >
问题:

当从命令行MSBUILD调用时,Xamarin将Java版本调整为1.7

羊舌赞
2023-03-14

为了自动构建签名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个答案

冯旭
2023-03-14

这看起来是一系列问题的结合。

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}" } } 需要注意的是。这种方式是每次都重新开始执行一次命令并退