Skip to content

Commit 45d6dd5

Browse files
authored
[Xamarin.Android.Build.Tasks] Fix @(JavaDocJar) (#5479) (#5511)
Fixes: #2745 Issue #2745 noted that `@(JavaDocJar)` didn't work; attempting to use it would result in an MSB3375 error: …/Xamarin.Android.Bindings.Documentation.targets(31,5): error MSB3375: The file "obj/Debug/javadocs/glide-3.7.0-javadoc.stamp" does not exist. This issue was subsequently hidden by 380e95e, which disabled the `_ExtractJavaDocJars` target unless JDK 1.8 was being used. There were two problems with 380e95e: 1. The `_ExtractJavaDocJars` target didn't need to be disabled! It just unzips the `.jar`; it does not require JDK 1.8. 2. The check for JDK 1.8 was bad, and was *never* True. The only documentation-related functionality that needed to be disabled because of JDK 11 was `@(JavaSourceJar)`, which got a better fix in commits a7413a2 and 0e95ec7 [not relevant for d16-9]. Fix the `_ExtractJavaDocJars` target so that it properly runs when there are any `@(JavaDocJar)` items, then fix the `_ExtractJavaDocJars` target so that it doesn't emit an MSB3375 error. Note: `@(JavaDocJar)` is still problematic: it involves parsing Javadoc HTML, which contains numerous "dialects" (it's why the JDK 11 commit skipped `@(JavaSourceJar)` support: trying to update our HTML scrapers was "too fiddly"). Deprecate `@(JavaDocJar)`. Fix the `$(_JavadocSupported)` test so that it is no longer always false, by moving it's definition into a `_GetJavadocSupported` target. This allows `$(_JdkVersion)` to be interpreted *after* it is set. Update the `BindingBuildTest.cs` infrastructure so that instead of having `.jar` files encoded in Base64, we instead use `@(EmbeddedResource)`s for the `.jar` files. A new `UpdateResources` target will update the appropriate `.jar` files.
1 parent 8608c5a commit 45d6dd5

File tree

14 files changed

+195
-78
lines changed

14 files changed

+195
-78
lines changed

Documentation/guides/building-apps/build-items.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,28 @@ such as `<AndroidLibrary Include="..." Bind="false" />`:
298298
</Project>
299299
```
300300

301+
## JavaDocJar
302+
303+
In a Xamarin.Android binding project, the **JavaDocJar** build action
304+
is used on `.jar` files which contain *Javadoc HTML*. The Javadoc HTML
305+
is parsed in order to extract parameter names.
306+
307+
Only certain "Javadoc HTML dialects" are supported, including:
308+
309+
* JDK 1.7 `javadoc` output
310+
* JDK 1.8 `javadoc` output
311+
* Droiddoc output
312+
313+
This build action is deprecated in Xamarin.Android 11.3, and will not be
314+
supported in .NET 6.
315+
The `@(JavaSourceJar)` build action should be preferred.
316+
317+
## JavaSourceJar
318+
319+
In a Xamarin.Android binding project, the **JavaSourceJar** build action
320+
is used on `.jar` files which contain *Java source code*, which contains
321+
[Javadoc documentation comments](https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html).
322+
301323
## LibraryProjectZip
302324

303325
In a Xamarin.Android binding project, the **LibraryProjectZip** build
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
### Issues fixed
2+
3+
* [GitHub 2745](https://github.com/xamarin/xamarin-android/issues/2745):
4+
The `@(JavaDocJar)` build action would either cause an MSB3375 error,
5+
or wasn't used at all.
6+
7+
#### Deprecation of JavaDocJar Build action in favor of JavaSourceJar
8+
9+
The `@(JavaDocJar)` Build action is deprecated, and will not work in .NET 6.
10+
Please use the `@(JavaSourceJar)` build action.

build-tools/installers/create-installers.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@
236236
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.targets" ExcludeFromAndroidNETSdk="true" />
237237
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.ClassParse.targets" />
238238
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.Core.targets" />
239-
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.Documentation.targets" />
239+
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.Documentation.targets" ExcludeFromAndroidNETSdk="true" />
240240
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.JarToXml.targets" ExcludeFromAndroidNETSdk="true" />
241241
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Build.Tasks.dll" />
242242
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Build.Tasks.pdb" />

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,27 @@ This file is only used by binding projects. .NET 5 can eventually use it, once `
1616
<UsingTask TaskName="Xamarin.Android.Tasks.MDoc" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
1717
<UsingTask TaskName="Xamarin.Android.Tasks.Unzip" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
1818

19-
<PropertyGroup>
20-
<_JavadocSupported Condition=" $(_JdkVersion.StartsWith ('1.8')) ">True</_JavadocSupported>
21-
</PropertyGroup>
22-
2319
<Target Name="_ExtractJavaDocJars"
24-
Condition=" '$(_JavadocSupported)' == 'True' "
2520
Inputs="@(JavaDocJar)"
2621
Outputs="@(JavaDocJar->'$(IntermediateOutputPath)javadocs\%(FileName).stamp')">
2722
<Unzip
2823
Sources="@(JavaDocJar)"
2924
DestinationDirectories="@(JavaDocJar->'$(IntermediateOutputPath)javadocs\%(FileName)')"
3025
/>
31-
<Touch Files="@(JavaDocJar->'$(IntermediateOutputPath)javadocs\%(FileName).stamp')" />
26+
<Touch Files="@(JavaDocJar->'$(IntermediateOutputPath)javadocs\%(FileName).stamp')" AlwaysCreate="true" />
3227
<ItemGroup>
3328
<JavaDocIndex Include="@(JavaDocJar->'$(IntermediateOutputPath)javadocs\%(FileName)\index.html')" />
3429
</ItemGroup>
3530
</Target>
3631

32+
<Target Name="_GetJavadocSupported">
33+
<PropertyGroup>
34+
<_JavadocSupported Condition=" '$(_JavadocSupported)' == '' And $(_JdkVersion.StartsWith ('1.8')) ">True</_JavadocSupported>
35+
</PropertyGroup>
36+
</Target>
37+
3738
<Target Name="_GenerateJavaDocFromSourceJars"
39+
DependsOnTargets="_GetJavadocSupported"
3840
Condition=" '$(_JavadocSupported)' == 'True' "
3941
Inputs="@(JavaSourceJar)"
4042
Outputs="@(JavaSourceJar->'$(IntermediateOutputPath)javadocs\%(FileName).stamp')">
@@ -57,6 +59,7 @@ This file is only used by binding projects. .NET 5 can eventually use it, once `
5759
</Target>
5860

5961
<Target Name="BuildDocumentation"
62+
DependsOnTargets="_GetJavadocSupported"
6063
Condition=" '@(JavaDocIndex->Count())' != '0' And '$(_JavadocSupported)' == 'True' "
6164
Inputs="@(JavaDocIndex);@(IntermediateAssembly->'$(IntermediateOutputPath)%(filename).xml')"
6265
Outputs="@(IntermediateAssembly->'$(OutputPath)%(filename).xml')">

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,30 @@ public void RemoveEventHandlerResolution ()
437437
}
438438
}
439439

440+
[Test]
441+
[Category ("DotNetIgnore")]
442+
public void JavaDocJar ()
443+
{
444+
var binding = new XamarinAndroidBindingProject () {
445+
AndroidClassParser = "class-parse",
446+
};
447+
binding.SetProperty ("DocumentationFile", "UnnamedProject.xml");
448+
using (var bindingBuilder = CreateDllBuilder ()) {
449+
binding.Jars.Add (new AndroidItem.EmbeddedJar ("javasourcejartest.jar") {
450+
BinaryContent = () => ResourceData.JavaSourceJarTestJar,
451+
});
452+
binding.OtherBuildItems.Add (new BuildItem ("JavaDocJar", "javasourcejartest-javadoc.jar") {
453+
BinaryContent = () => ResourceData.JavaSourceJarTestJavadocJar,
454+
});
455+
Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded");
456+
457+
var cs_file = bindingBuilder.Output.GetIntermediaryPath (
458+
Path.Combine ("generated", "src", "Com.Xamarin.Android.Test.Msbuildtest.JavaSourceJarTest.cs"));
459+
FileAssert.Exists (cs_file);
460+
StringAssert.Contains ("Greet (string name, global::Java.Util.Date date)", File.ReadAllText (cs_file));
461+
}
462+
}
463+
440464
[Test]
441465
public void JavaSourceJar ()
442466
{
@@ -446,10 +470,10 @@ public void JavaSourceJar ()
446470
binding.SetProperty ("DocumentationFile", "UnnamedProject.xml");
447471
using (var bindingBuilder = CreateDllBuilder ()) {
448472
binding.Jars.Add (new AndroidItem.EmbeddedJar ("javasourcejartest.jar") {
449-
BinaryContent = () => Convert.FromBase64String (InlineData.JavaClassesJarBase64)
473+
BinaryContent = () => ResourceData.JavaSourceJarTestJar,
450474
});
451475
binding.OtherBuildItems.Add (new BuildItem ("JavaSourceJar", "javasourcejartest-sources.jar") {
452-
BinaryContent = () => Convert.FromBase64String (InlineData.JavaSourcesJarBase64)
476+
BinaryContent = () => ResourceData.JavaSourceJarTestSourcesJar,
453477
});
454478
Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded");
455479
var jdkVersion = GetJdkVersion ();
@@ -521,7 +545,7 @@ public void NullableReferenceTypes (string classParser)
521545
AndroidClassParser = classParser,
522546
Jars = {
523547
new AndroidItem.EmbeddedJar ("foo.jar") {
524-
BinaryContent = () => Convert.FromBase64String (InlineData.JavaClassesJarBase64),
548+
BinaryContent = () => ResourceData.JavaSourceJarTestJar,
525549
}
526550
}
527551
};
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<Project>
2+
3+
<Target Name="UpdateResources"
4+
DependsOnTargets="_UpdateJavaSourceJar_Bytecode;_UpdateJavaSourceJar_Sources;_UpdateJavaSourceJar_Javadoc">
5+
</Target>
6+
7+
<ItemGroup>
8+
<JavaSourceJarTest Include="java/com/microsoft/android/test/msbuildtest/JavaSourceJarTest.java" />
9+
</ItemGroup>
10+
11+
<Target Name="_UpdateJavaSourceJar_Bytecode"
12+
Inputs="@(JavaSourceJarTest)"
13+
Outputs="Resources\javasourcejartest.jar">
14+
<PropertyGroup>
15+
<_SourceVersions>-source $(JavacSourceVersion) -target $(JavacTargetVersion)</_SourceVersions>
16+
<_Outdir>$(IntermediateOutputPath)/classes</_Outdir>
17+
</PropertyGroup>
18+
<MakeDir Directories="$(_Outdir)" />
19+
<!-- Note: do NOT include `-parameters`; we want parameter name inferrence via -sources or -javadoc -->
20+
<Exec Command="$(JavaCPath) $(_SourceVersions) -d $(_Outdir) @(JavaSourceJarTest, ' ')" />
21+
<Exec
22+
Command="$(JarPath) cf Resources/javasourcejartest.jar -C $(_Outdir) ."
23+
WorkingDirectory="$(MSBuildThisFileDirectory)"
24+
/>
25+
</Target>
26+
27+
<Target Name="_UpdateJavaSourceJar_Sources"
28+
Inputs="@(JavaSourceJarTest)"
29+
Outputs="Resources\javasourcejartest-sources.jar">
30+
<Exec
31+
Command="$(JarPath) cf Resources/javasourcejartest-sources.jar -C java ."
32+
WorkingDirectory="$(MSBuildThisFileDirectory)"
33+
/>
34+
</Target>
35+
36+
<Target Name="_UpdateJavaSourceJar_Javadoc"
37+
Inputs="@(JavaSourceJarTest)"
38+
Outputs="Resources/javasourcejartest-javadoc.jar">
39+
<PropertyGroup>
40+
<_Javadoc>"$(Java8SdkDirectory)/bin/javadoc"</_Javadoc>
41+
<_Outdir>$(IntermediateOutputPath)/javadoc</_Outdir>
42+
</PropertyGroup>
43+
<MakeDir Directories="$(_Outdir)" />
44+
<Exec
45+
Command="$(_Javadoc) -public -d &quot;$(_Outdir)&quot; @(JavaSourceJarTest, ' ')"
46+
WorkingDirectory="$(MSBuildThisFileDirectory)"
47+
/>
48+
<Exec
49+
Command="$(JarPath) cf Resources/javasourcejartest-javadoc.jar -C &quot;$(_Outdir)&quot; ."
50+
WorkingDirectory="$(MSBuildThisFileDirectory)"
51+
/>
52+
</Target>
53+
54+
</Project>
Binary file not shown.

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/InlineData.cs

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8,61 +8,6 @@ namespace Xamarin.Android.Build.Tests
88
{
99
static class InlineData
1010
{
11-
#if false // Java source with javadoc
12-
package com.xamarin.android.test.msbuildtest;
13-
14-
public class JavaSourceJarTest
15-
{
16-
/**
17-
* Returns greeting message.
18-
* <p>
19-
* Returns "Morning, ", "Hello, " or "Evening, " with name argument,
20-
* depending on the argument hour.
21-
* </p>
22-
* @param name name to display.
23-
* @param date time to determine the greeting message.
24-
* @return the resulting message.
25-
*/
26-
public String greet (String name, java.util.Date date)
27-
{
28-
String head = date.getHours () < 11 ? "Morning, " : date.getHours () < 17 ? "Hello, " : "Evening, ";
29-
return head + name;
30-
}
31-
}
32-
#endif
33-
34-
public const string JavaSourcesJarBase64 = @"
35-
UEsDBBQACAgIAC2gP0wAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMAUEsHCAAAAAACAAAAAAAAAFBLAwQUAAgIC
36-
AAtoD9MAAAAAAAAAAAAAAAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1G803My0xLLS7RDUstKs7Mz7NSMNQz4OVyLkpNLE
37-
lN0XWqBAlY6BnEG5oaKmj4FyUm56QqOOcXFeQXJZYA1WvycvFyAQBQSwcIlldz8EQAAABFAAAAUEsDBBQACAgIACqgP0w
38-
AAAAAAAAAAAAAAAA7AAAAY29tL3hhbWFyaW4vYW5kcm9pZC90ZXN0L21zYnVpbGR0ZXN0L0phdmFTb3VyY2VKYXJUZXN0
39-
LmphdmF1kc1uwjAMx+99CosTsCqI0yRgG4dNQki7jL2Aaaw2Wz4qJ2WbJt59SSgfQsyq4kb+2X/babH6xJqgckZ8o0FWV
40-
qCV7JQUgXwQxm87pWX6nxdF2221qqDS6D2scYcb13FFa+T3CBS/BUSbjMfZwxjeKHRsPdRMFJStwZD3UU8cgUX7eM0OXh
41-
3byJYwiN+KtHbRg2MYvOyoj8CXCg1YNATIdWfIhvJYSFJLViY1ZyE0ZwKa2O1ZenLWXrbIaA718hEcSOVbjT/iipEYYlj
42-
1DAVioyxlnX+nXHKeLUNMvtO3qEn2/YY3gROSK8Kwv6XOSviIaxddUFo8p1ZSP6Oceth+sp5vCCU8ZELUFFZxeg/DESxg
43-
OoWny0XD7JSb7FbGfco4vcbs8jHmp+R+zix8l/s9xPbFvvgDUEsHCDlC8jY2AQAAawIAAFBLAQIUABQACAgIAC2gP0wAA
44-
AAAAgAAAAAAAAAJAAQAAAAAAAAAAAAAAAAAAABNRVRBLUlORi/+ygAAUEsBAhQAFAAICAgALaA/TJZXc/BEAAAARQAAAB
45-
QAAAAAAAAAAAAAAAAAPQAAAE1FVEEtSU5GL01BTklGRVNULk1GUEsBAhQAFAAICAgAKqA/TDlC8jY2AQAAawIAADsAAAA
46-
AAAAAAAAAAAAAwwAAAGNvbS94YW1hcmluL2FuZHJvaWQvdGVzdC9tc2J1aWxkdGVzdC9KYXZhU291cmNlSmFyVGVzdC5q
47-
YXZhUEsFBgAAAAADAAMA5gAAAGICAAAAAA==";
48-
49-
public const string JavaClassesJarBase64 = @"
50-
UEsDBBQACAgIAO+EP0wAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMAUEsHCAAAAAACAAAAAAAAAFBLAwQUAAgIC
51-
ADvhD9MAAAAAAAAAAAAAAAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1G803My0xLLS7RDUstKs7Mz7NSMNQz4OVyLkpNLE
52-
lN0XWqBAlY6BnEG5oaKmj4FyUm56QqOOcXFeQXJZYA1WvycvFyAQBQSwcIlldz8EQAAABFAAAAUEsDBBQACAgIALOEP0w
53-
AAAAAAAAAAAAAAAA8AAAAY29tL3hhbWFyaW4vYW5kcm9pZC90ZXN0L21zYnVpbGR0ZXN0L0phdmFTb3VyY2VKYXJUZXN0
54-
LmNsYXNzbVHZSsNAFD1j2yStaW3rvlvX1i0g4osiuKLi8lARfHPaDCWaJiWdit/ji6/6UkHBD/CjxDupIloDucuZO+fMn
55-
Hn/eHkDsIpCAp3oS6AfAwYGDQwZGNYxkoCmUA2jKozpGNcxwaBtOJ4jNxki+cIFQ3THtwVD17HjidNGtSSCc15yCYlVAi
56-
Ekw1r++JrfcsvlXsUqysDxKustpCEd19rlUqwX2kcYkkXJyzcnvBYS6sgxJIp+IyiLfUcJ9B3RnhZwxINzUZfLisWEiaS
57-
OSRNTmGaIn/iBR4SLdHT9QLiur6r43q34Rvv/am83HNcWgYkZzJqYQ54uUfar1h2vclq3uGcHvmNbkiStar2kxsO67UAM
58-
6R/ys9K1KP+GWnoMqd9+MBgVIQ+IqR7afEiu81pNeDbD0j92ttv3dQVy0ZD+t0pP/h+fkYN6fvV1gCnvKKaoG6XMKMfmn
59-
8GeqKBHpqiFYIRiGpmv0SvaGqW8sthER7rzHkY28oDusMuoLvqAWDZ2+grt8hn6UhPGAv1NxB9DWcWbIk4QYxeyGEc3Rc
60-
BAJJXc0qmjw4eTvZ9QSwcINzBZxakBAAC1AgAAUEsBAhQAFAAICAgA74Q/TAAAAAACAAAAAAAAAAkABAAAAAAAAAAAAAA
61-
AAAAAAE1FVEEtSU5GL/7KAABQSwECFAAUAAgICADvhD9Mlldz8EQAAABFAAAAFAAAAAAAAAAAAAAAAAA9AAAATUVUQS1J
62-
TkYvTUFOSUZFU1QuTUZQSwECFAAUAAgICACzhD9MNzBZxakBAAC1AgAAPAAAAAAAAAAAAAAAAADDAAAAY29tL3hhbWFya
63-
W4vYW5kcm9pZC90ZXN0L21zYnVpbGR0ZXN0L0phdmFTb3VyY2VKYXJUZXN0LmNsYXNzUEsFBgAAAAADAAMA5wAAANYCAA
64-
AAAA==";
65-
6611
const string Resx = @"<?xml version=""1.0"" encoding=""utf-8""?>
6712
<root>
6813
<resheader name=""resmimetype"">

0 commit comments

Comments
 (0)