Skip to content

Commit 0e1d1c8

Browse files
jonpryordellis1972
authored andcommitted
[build] Cursory JDK 9 support (#1214)
We have a VSTS+macOS build machine which has JDK 9 as the default JDK, thus causing *all* xamarin-android builds to fail, as `gradlew` and JDK 9 don't *directly* mix: Executing: ./gradlew assembleDebug --stacktrace ... org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':library'. ... Caused by: org.gradle.internal.event.ListenerNotificationException: Failed to notify project evaluation listener. ... Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema ... Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema When using JDK 9, `gradlew` fails because *something* within it attempts to use the deprecated type `javax.xml.bind.annotation.XmlSchema`, and JDK 9 doesn't provide deprecated modules in the default `$CLASSPATH`. Knowing that the VSTS machine *also* has JDK 8 installed, we've tried to "filter out" JDK 9 so that it wouldn't be used; see e.g. a3c4358. Unfortunately that doesn't work, because on macOS the default JDK used is [always the JDK with the highest version number][macOS-jdk], and this can't be easily changed system-wide because changing this behavior requires "removing" a `Info.plist` file to prevent the JDK from being "seen" by `/usr/bin/java`: [macOS-jdk]: https://stackoverflow.com/a/44169445 # Don't use JDK 9 by default on macOS: $ cd /Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents $ mv Info.plist Info.plist.disabled (Renaming `Info.plist.disabled` to `Info.plist` will restore JDK 9 as the default JDK on the machine.) A "proper" fix would presumably involve using and exporting `$JAVA_HOME` *everywhere*, which isn't currently the case. [This is something that *should* be explored.][xa-1213] [xa-1213]: #1213 In the meantime, a question: *Can* we build with JDK 9? *Is it even possible in the first place*? Turns out, *yes*, it *is* possible. The above `gradlew` error can be fixed by providing the (new-in-JDK9) `--add-modules` option, so that the `java.xml.bind` module is accessible: $ ANDROID_HOME=... JAVA_OPTS="--add-modules java.xml.bind" ./gradlew assembleDebug --stacktrace --no-daemon # ...works! Unfortunately, *other* parts xamarin-android get in the way, e.g. the `<ResolveSdks/>` task doesn't correctly parse the version number out of `java -version`, and JDK 9 `javac` requires `-source` and `-target` when `-bootclasspath` is used. Update the build system and tests so that things *can* be built under JDK 9. Additionally, cleanup the internal build system a bit: instead of having `javac` and `jar` calls strewn throughout *7* different projects -- all of which would need to be updated to provide usable `javac -source` and `javac -target` values (JDK 9 doesn't support `-target 1.6` anymore!), introduce `build-tools\scripts\Jar.targets` and the new `BuildTestJarFile` target. This takes all `@(TestJarEntry)` files, compiles them with `javac`, and `jar`s the compiled files into `%(TestJarEntry.OutputFile)`. **Note**: This does ***NOT*** mean that building and/or using JDK 9 will be commercially supported in *any* way. (It might not even work!)
1 parent 4920650 commit 0e1d1c8

20 files changed

+271
-177
lines changed

build-tools/scripts/Jar.targets

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<Target Name="_GetJavacVersions"
4+
DependsOnTargets="AndroidPrepareForBuild">
5+
<PropertyGroup>
6+
<_JavacSourceVersion Condition="$(_JdkVersion.StartsWith ('9'))">1.8</_JavacSourceVersion>
7+
<_JavacSourceVersion Condition=" '$(_JavacSourceVersion)' == '' ">1.5</_JavacSourceVersion>
8+
<_JavacTargetVersion Condition="$(_JdkVersion.StartsWith ('9'))">1.8</_JavacTargetVersion>
9+
<_JavacTargetVersion Condition=" '$(_JavacTargetVersion)' == '' ">1.6</_JavacTargetVersion>
10+
</PropertyGroup>
11+
</Target>
12+
<Target Name="BuildTestJarFile"
13+
DependsOnTargets="_GetJavacVersions"
14+
Inputs="@(TestJarEntry)"
15+
Outputs="%(TestJarEntry.OutputFile)">
16+
<ItemGroup>
17+
<_JavacSource
18+
Include="@(TestJarEntry)"
19+
/>
20+
</ItemGroup>
21+
<PropertyGroup>
22+
<_Javac>"$(JavaCPath)"</_Javac>
23+
<_Jar>"$(JarPath)"</_Jar>
24+
<_Targets>-source $(_JavacSourceVersion) -target $(_JavacTargetVersion)</_Targets>
25+
<_DestDir>$(IntermediateOutputPath)__CreateTestJarFile-bin</_DestDir>
26+
<_AndroidJar>-cp "$(AndroidSdkDirectory)\platforms\android-$(_AndroidApiLevelName)\android.jar"</_AndroidJar>
27+
</PropertyGroup>
28+
<MakeDir Directories="$(_DestDir)" />
29+
<Exec Command="$(_Javac) $(_Targets) -d &quot;$(_DestDir)&quot; $(_AndroidJar) @(_JavacSource->'&quot;%(Identity)&quot;', ' ')" />
30+
<Exec
31+
Command="$(_Jar) cf &quot;classes.jar&quot; ."
32+
WorkingDirectory="$(_DestDir)"
33+
/>
34+
<Copy
35+
SourceFiles="$(_DestDir)\classes.jar"
36+
DestinationFiles="%(TestJarEntry.OutputFile)"
37+
/>
38+
<RemoveDir Directories="$(_DestDir)" />
39+
</Target>
40+
<Target Name="CleanTestJarFile">
41+
<Delete Files="%(TestJarEntry.OutputFile)" />
42+
</Target>
43+
</Project>

src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77

88
namespace Xamarin.Android.Tasks
99
{
10-
public class AdjustJavacVersionArguments : ToolTask
10+
public class AdjustJavacVersionArguments : Task
1111
{
1212
[Required]
13-
public string ToolPath { get; set; }
13+
public string JdkVersion { get; set; }
14+
15+
[Required]
16+
public string DefaultJdkVersion { get; set; }
1417

1518
public bool EnableProguard { get; set; }
1619

@@ -24,53 +27,32 @@ public class AdjustJavacVersionArguments : ToolTask
2427
[Output]
2528
public string SourceVersion { get; set; }
2629

27-
protected override string ToolName {
28-
get { return OS.IsWindows ? "javac.exe" : "javac"; }
29-
}
30-
3130
public override bool Execute ()
3231
{
33-
Log.LogDebugMessage ("ToolPath: {0}", ToolPath);
34-
Log.LogDebugMessage ("ToolExe: {0}", ToolExe);
32+
Log.LogDebugMessage ($"{nameof (DefaultJdkVersion)}: {DefaultJdkVersion}");
3533
Log.LogDebugMessage ("EnableProguard: {0}", EnableProguard);
3634
Log.LogDebugMessage ("EnableMultiDex: {0}", EnableMultiDex);
35+
Log.LogDebugMessage ($"{nameof (JdkVersion)}: {JdkVersion}");
3736
Log.LogDebugMessage ("SkipJavacVersionCheck: {0}", SkipJavacVersionCheck);
3837

38+
if (JdkVersion.StartsWith ("9", StringComparison.OrdinalIgnoreCase)) {
39+
TargetVersion = SourceVersion = DefaultJdkVersion;
40+
}
41+
3942
if (SkipJavacVersionCheck)
4043
return true;
4144

4245
// so far only proguard matters.
4346
if (!EnableProguard && !EnableMultiDex)
4447
return true;
4548

46-
var psi = new ProcessStartInfo (Path.Combine (ToolPath, ToolExe ?? ToolName), "-version") {
47-
RedirectStandardOutput = true,
48-
RedirectStandardError = true,
49-
UseShellExecute = false,
50-
CreateNoWindow = true,
51-
WindowStyle = ProcessWindowStyle.Hidden,
52-
};
53-
var proc = Process.Start (psi);
54-
proc.WaitForExit ();
55-
var line = proc.StandardError.ReadLine ();
56-
if (!line.StartsWith ("javac "))
57-
// otherwise ignore.
58-
return true;
59-
60-
var version = line.Substring (6);
61-
62-
if (version.StartsWith ("1.8")) {
49+
if (JdkVersion.StartsWith ("1.8", StringComparison.OrdinalIgnoreCase)) {
6350
TargetVersion = SourceVersion = "1.7";
6451
Log.LogDebugMessage ("Javac TargetVersion adjusted to: {0}", TargetVersion);
6552
Log.LogDebugMessage ("Javac SourceVersion adjusted to: {0}", SourceVersion);
6653
}
6754

68-
return true;
69-
}
70-
71-
protected override string GenerateFullPathToTool ()
72-
{
73-
return Path.Combine (ToolPath, ToolExe);
55+
return !Log.HasLoggedErrors;
7456
}
7557
}
7658
}

src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ public class ResolveSdks : Task
116116
[Output]
117117
public bool AndroidUseApkSigner { get; set; }
118118

119+
[Output]
120+
public string JdkVersion { get; set; }
121+
122+
[Output]
123+
public string MinimumRequiredJdkVersion { get; set; }
124+
119125
static bool IsWindows = Path.DirectorySeparatorChar == '\\';
120126
static readonly string ZipAlign = IsWindows ? "zipalign.exe" : "zipalign";
121127
static readonly string Aapt = IsWindows ? "aapt.exe" : "aapt";
@@ -140,6 +146,7 @@ public bool RunTask ()
140146
Log.LogDebugMessage (" AndroidSdkBuildToolsVersion: {0}", AndroidSdkBuildToolsVersion);
141147
Log.LogDebugMessage ($" {nameof (AndroidSdkPath)}: {AndroidSdkPath}");
142148
Log.LogDebugMessage ($" {nameof (AndroidNdkPath)}: {AndroidNdkPath}");
149+
Log.LogDebugMessage ($" {nameof (JavaSdkPath)}: {JavaSdkPath}");
143150
Log.LogDebugTaskItems (" ReferenceAssemblyPaths: ", ReferenceAssemblyPaths);
144151
Log.LogDebugMessage (" TargetFrameworkVersion: {0}", TargetFrameworkVersion);
145152
Log.LogDebugMessage (" UseLatestAndroidPlatformSdk: {0}", UseLatestAndroidPlatformSdk);
@@ -280,6 +287,8 @@ public bool RunTask ()
280287
Log.LogDebugMessage (" AndroidSdkBuildToolsBinPath: {0}", AndroidSdkBuildToolsBinPath);
281288
Log.LogDebugMessage (" AndroidSdkPath: {0}", AndroidSdkPath);
282289
Log.LogDebugMessage (" JavaSdkPath: {0}", JavaSdkPath);
290+
Log.LogDebugMessage (" JdkVersion: {0}", JdkVersion);
291+
Log.LogDebugMessage (" MinimumRequiredJdkVersion: {0}", MinimumRequiredJdkVersion);
283292
Log.LogDebugMessage (" MonoAndroidBinPath: {0}", MonoAndroidBinPath);
284293
Log.LogDebugMessage (" MonoAndroidToolsPath: {0}", MonoAndroidToolsPath);
285294
Log.LogDebugMessage (" TargetFrameworkVersion: {0}", TargetFrameworkVersion);
@@ -320,7 +329,10 @@ public bool RunTask ()
320329
return !Log.HasLoggedErrors;
321330
}
322331

323-
static readonly Regex javaVersionRegex = new Regex (@"""(?<version>[\d\.]+)_\d+""");
332+
// `java -version` will produce values such as:
333+
// java version "9.0.4"
334+
// java version "1.8.0_77"
335+
static readonly Regex javaVersionRegex = new Regex (@"version ""(?<version>[\d\.]+)(_\d+)?""");
324336

325337
Version GetJavaVersionForFramework (string targetFrameworkVersion)
326338
{
@@ -350,6 +362,8 @@ bool ValidateJavaVersion (string targetFrameworkVersion, string buildToolsVersio
350362
Version requiredJavaForBuildTools = GetJavaVersionForBuildTools (buildToolsVersion);
351363

352364
Version required = requiredJavaForFrameworkVersion > requiredJavaForBuildTools ? requiredJavaForFrameworkVersion : requiredJavaForBuildTools;
365+
366+
MinimumRequiredJdkVersion = required.ToString ();
353367

354368
var sb = new StringBuilder ();
355369

@@ -372,15 +386,19 @@ bool ValidateJavaVersion (string targetFrameworkVersion, string buildToolsVersio
372386
var versionNumberMatch = javaVersionRegex.Match (versionInfo);
373387
Version versionNumber;
374388
if (versionNumberMatch.Success && Version.TryParse (versionNumberMatch.Groups ["version"]?.Value, out versionNumber)) {
389+
JdkVersion = versionNumberMatch.Groups ["version"].Value;
375390
Log.LogMessage (MessageImportance.Normal, $"Found Java SDK version {versionNumber}.");
376391
if (versionNumber < requiredJavaForFrameworkVersion) {
377392
Log.LogError ($"Java SDK {requiredJavaForFrameworkVersion} or above is required when targeting FrameworkVerison {targetFrameworkVersion}.");
378393
}
379394
if (versionNumber < requiredJavaForBuildTools) {
380395
Log.LogError ($"Java SDK {requiredJavaForBuildTools} or above is required when using build-tools {buildToolsVersion}.");
381396
}
397+
if (versionNumber > Version.Parse (LatestSupportedJavaVersion)) {
398+
Log.LogWarning ($"JDK Version `{versionNumber}` is later than latest suppored JDK version `{LatestSupportedJavaVersion}`.");
399+
}
382400
} else
383-
Log.LogWarning ($"Failed to get the Java SDK version. Found {versionInfo} but this does not seem to contain a valid version number.");
401+
Log.LogWarning ($"Failed to get the Java SDK version as it does not appear to contain a valid version number. `javac -version` returned: ```{versionInfo}```");
384402
return !Log.HasLoggedErrors;
385403
}
386404

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ Copyright (C) 2012 Xamarin Inc. All rights reserved.
190190
<Output TaskParameter="JavaSdkPath" PropertyName="JavaSdkDirectory" Condition="'$(JavaSdkDirectory)' == ''" />
191191
<Output TaskParameter="MonoAndroidToolsPath" PropertyName="MonoAndroidToolsDirectory" />
192192
<Output TaskParameter="AndroidSdkBuildToolsBinPath" PropertyName="AndroidSdkBuildToolsBinPath" Condition="'$(AndroidSdkBuildToolsBinPath)' == ''" />
193+
<Output TaskParameter="JdkVersion" PropertyName="_JdkVersion" />
194+
<Output TaskParameter="MinimumRequiredJdkVersion" PropertyName="_DefaultJdkVersion" />
193195
</ResolveSdks>
194196
<CreateProperty Value="$(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion),Profile=$(TargetFrameworkProfile)">
195197
<Output TaskParameter="Value" PropertyName="TargetFrameworkMoniker"

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,8 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
664664
<Output TaskParameter="LintToolPath" PropertyName="LintToolPath" Condition="'$(LintToolPath)' == ''" />
665665
<Output TaskParameter="ApkSignerToolExe" PropertyName="ApkSignerToolExe" Condition="'$(ApkSignerToolExe)' == ''" />
666666
<Output TaskParameter="AndroidUseApkSigner" PropertyName="AndroidUseApkSigner" Condition="'$(AndroidUseApkSigner)' == ''" />
667+
<Output TaskParameter="JdkVersion" PropertyName="_JdkVersion" />
668+
<Output TaskParameter="MinimumRequiredJdkVersion" PropertyName="_DefaultJdkVersion" />
667669
</ResolveSdks>
668670
<CreateProperty Value="$(TargetFrameworkIdentifier),Version=$(_TargetFrameworkVersion),Profile=$(TargetFrameworkProfile)">
669671
<Output TaskParameter="Value" PropertyName="TargetFrameworkMoniker"
@@ -2007,12 +2009,12 @@ because xbuild doesn't support framework reference assemblies.
20072009
<Target Name="_AdjustJavacVersionArguments">
20082010

20092011
<AdjustJavacVersionArguments
2010-
Condition="'$(JavacTargetVersion)'=='' or '$(JavacSourceVersion)' == ''"
2011-
ToolPath="$(JavacToolPath)"
2012-
ToolExe="$(JavacToolExe)"
2013-
SkipJavacVersionCheck="$(AndroidSkipJavacVersionCheck)"
2014-
EnableProguard="$(AndroidEnableProguard)"
2015-
EnableMultiDex="$(AndroidEnableMultiDex)">
2012+
Condition=" '$(JavacTargetVersion)' == '' or '$(JavacSourceVersion)' == '' "
2013+
JdkVersion="$(_JdkVersion)"
2014+
DefaultJdkVersion="$(_DefaultJdkVersion)"
2015+
SkipJavacVersionCheck="$(AndroidSkipJavacVersionCheck)"
2016+
EnableProguard="$(AndroidEnableProguard)"
2017+
EnableMultiDex="$(AndroidEnableMultiDex)">
20162018
<Output TaskParameter="TargetVersion" PropertyName="JavacTargetVersion" />
20172019
<Output TaskParameter="SourceVersion" PropertyName="JavacSourceVersion" />
20182020
</AdjustJavacVersionArguments>

tests/CodeGen-Binding/Xamarin.Android.FixJavaAbstractMethod-APIv1Binding/Xamarin.Android.FixJavaAbstractMethod-APIv1Binding.csproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,22 @@
6161
<InputJar Include="Jars\Cursor.jar" />
6262
</ItemGroup>
6363
<ItemGroup>
64-
<InputJarSource Include="java\test\bindings\Cursor.java" />
64+
<TestJarEntry Include="java\test\bindings\Cursor.java">
65+
<OutputFile>Jars/Cursor.jar</OutputFile>
66+
</TestJarEntry>
6567
</ItemGroup>
6668
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.Bindings.targets" />
69+
<Import Project="..\..\..\build-tools\scripts\Jar.targets" />
6770
<Import Project="Xamarin.Android.FixJavaAbstractMethod-APIv1Binding.targets" />
6871
<PropertyGroup>
6972
<BuildDependsOn>
70-
BuildJars;
73+
BuildTestJarFile;
7174
$(BuildDependsOn)
7275
</BuildDependsOn>
7376
</PropertyGroup>
7477
<PropertyGroup>
7578
<CleanDependsOn>
79+
CleanTestJarFile;
7680
$(CleanDependsOn);
7781
CleanLocal;
7882
</CleanDependsOn>
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
<Target Name="BuildJars"
4-
DependsOnTargets="AndroidPrepareForBuild"
5-
Inputs="@(InputJarSource)"
6-
Outputs="@(InputJar)">
7-
<MakeDir Directories="Jars\classes" />
8-
<Exec Command="&quot;$(JavaCPath)&quot; -source 1.5 -target 1.6 -d &quot;Jars\classes&quot; @(InputJarSource -&gt; '%(Identity)', ' ')" />
9-
<Exec Command="&quot;$(JarPath)&quot; cf &quot;@(InputJar)&quot; -C &quot;Jars\classes&quot; ." />
10-
</Target>
113
<Target Name="CleanLocal">
12-
<RemoveDir Directories="bin;obj;Jars\classes;@(InputJar)"/>
4+
<RemoveDir Directories="bin;obj;"/>
135
</Target>
146
</Project>

tests/CodeGen-Binding/Xamarin.Android.FixJavaAbstractMethod-APIv2Binding/Xamarin.Android.FixJavaAbstractMethod-APIv2Binding.csproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,22 @@
6161
<InputJar Include="Jars\Cursor.jar" />
6262
</ItemGroup>
6363
<ItemGroup>
64-
<InputJarSource Include="java\test\bindings\Cursor.java" />
64+
<TestJarEntry Include="java\test\bindings\Cursor.java">
65+
<OutputFile>Jars/Cursor.jar</OutputFile>
66+
</TestJarEntry>
6567
</ItemGroup>
6668
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.Bindings.targets" />
69+
<Import Project="..\..\..\build-tools\scripts\Jar.targets" />
6770
<Import Project="Xamarin.Android.FixJavaAbstractMethod-APIv2Binding.targets" />
6871
<PropertyGroup>
6972
<BuildDependsOn>
70-
BuildJars;
73+
BuildTestJarFile;
7174
$(BuildDependsOn)
7275
</BuildDependsOn>
7376
</PropertyGroup>
7477
<PropertyGroup>
7578
<CleanDependsOn>
79+
CleanTestJarFile;
7680
$(CleanDependsOn);
7781
CleanLocal;
7882
</CleanDependsOn>
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
<Target Name="BuildJars"
4-
DependsOnTargets="AndroidPrepareForBuild"
5-
Inputs="@(InputJarSource)"
6-
Outputs="@(InputJar)">
7-
<MakeDir Directories="Jars\classes" />
8-
<Exec Command="&quot;$(JavaCPath)&quot; -source 1.5 -target 1.6 -d &quot;Jars\classes&quot; @(InputJarSource -&gt; '%(Identity)', ' ')" />
9-
<Exec Command="&quot;$(JarPath)&quot; cf &quot;@(InputJar)&quot; -C &quot;Jars\classes&quot; ." />
10-
</Target>
113
<Target Name="CleanLocal">
12-
<RemoveDir Directories="bin;obj;Jars\classes;@(InputJar)"/>
4+
<RemoveDir Directories="bin;obj"/>
135
</Target>
146
</Project>

tests/CodeGen-Binding/Xamarin.Android.LibraryProjectZip-LibBinding/Xamarin.Android.LibraryProjectZip-LibBinding.targets

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@
4242
DependsOnTargets="AndroidPrepareForBuild"
4343
Inputs="java\JavaLib\project.properties"
4444
Outputs="$(OutputPath)JavaLib.zip">
45+
<PropertyGroup>
46+
<_Jdk9Modules Condition="$(_JdkVersion.StartsWith ('9'))">JAVA_OPTS="--add-modules java.xml.bind"</_Jdk9Modules>
47+
</PropertyGroup>
4548
<Exec
4649
EnvironmentVariables="ANDROID_HOME=$(AndroidSdkDirectory);JAVA_HOME=$(JavaSdkDirectory)"
47-
Command=".\gradlew assembleDebug --stacktrace"
50+
Command="$(_Jdk9Modules) .\gradlew assembleDebug --stacktrace --no-daemon"
4851
WorkingDirectory="$(MSBuildThisFileDirectory)java\JavaLib"
4952
/>
5053
<MakeDir Directories="$(OutputPath)" />

0 commit comments

Comments
 (0)