GroupDocs.Assembly for Java 26.9 Release Notes

Full list of changes in this release

IDSummaryCategory
ASSEMBLYJAVAEmbedded Aspose venture license renewed — the previous one expired on 2024-09-18, which is what pinned the product to Aspose components of 2020Fix
ASSEMBLYJAVAEmbedded license moved out of the generated code into a resource; tools/AsposeLicenseResourceGenerator.java restored so that renewing it is a matter of replacing one fileUpdate
ASSEMBLYJAVABundled Aspose components moved to the versions GroupDocs.Assembly for .NET is built against: Words 23.10 → 26.3, Cells 20.7 → 26.3, Slides 20.2 → 26.2, Email 20.7 → 26.1, BarCode 20.4 → 26.6Update
ASSEMBLYJAVAAspose.Cells no longer writes the evaluation watermark into every spreadsheet: 20.7 ignored a current license without a wordFix
ASSEMBLYJAVAAspose.Slides accepts the current license again — 20.2 verified the signature with a 1024 bit key and rejected the 2048 bit one (“Signature length not correct: got 256 but was expecting 128”)Fix
ASSEMBLYJAVAAdapted to the API of the new components: BarCode EncodeTypes / BaseEncodeType / ITF14BorderType moved into the generation package with four symbologies renamed, Cells FileFormatType.EXCEL_2003_XMLSPREADSHEET_ML, Slides IImageCollection.addImage(BufferedImage) replaced by PNG bytes, Email MapiMessage.fromFile() removedUpdate
ASSEMBLYJAVAFont fallback settings of the repackaged Aspose.Foundation are found again — resources routed to com.groupdocs.assembly.internal.c.a.resources instead of ...c.a.w.resources; every template that measures text, a <<barcode [value] -dm>> tag among them, failed with “Resurce not found Aspose.Resources.MsOfficeFallbackSetting.xml”Fix
ASSEMBLYJAVABarcodes, port of ASSEMBLYNET-60: code text location of Pdf417Fix
ASSEMBLYJAVABarcodes, port of ASSEMBLYNET-60: a transparent colour counts as undefined, black and white are the defaultsFix
ASSEMBLYJAVABarcodes, port of ASSEMBLYNET-60: minimum dimension of CodabarFix
ASSEMBLYJAVABarcodes, port of ASSEMBLYNET-60: no exception when the image is too small for its barcodeFix
ASSEMBLYJAVABarcodes: minimum dimension for MaxiCode — the Java build gave up at the dimension the product’s own templates produce, unlike the .NET oneFix
ASSEMBLYJAVABarcodes: the code text of a valid ITF6 is five digits, not sixFix
ASSEMBLYJAVAThread local leak in licensing: LicensingPalUtil clears the verification state with remove() instead of storing null, which kept an entry alive for the life of a pooled thread (java:S5164)Fix
ASSEMBLYJAVADuplicate CultureInfo.xml removed — src/main/resources/com/aspose/words/resources/patched/ was packaged alongside the copy next to itFix
ASSEMBLYJAVAGOLD comparers brought up to their .NET counterparts: random axId / crossAx of the chart engines, the random creationId Aspose.Cells writes per shape, the extra default attributes of a:bodyPr, the default alignment of a:pPr and the Aspose.Slides version in docProps/app.xmlTest
ASSEMBLYJAVAGOLD comparers: images compared pixel by pixel with a tolerance on the dimensions, so byte-different but visually equal PNGs no longer failTest
ASSEMBLYJAVAPort of ASSEMBLYNET-136: word/glossary/document.xml and word/footer*.xml routed through the same difference evaluator as the document body, and the w14:paraId / w14:textId markers of Aspose.Words 26.7 tolerated on GOLD files that predate themTest
ASSEMBLYJAVAPort of ASSEMBLYNET-134: the narrow no-break space that CLDR locale data of JDK 9+ puts before the AM/PM designator normalized in the value format testsTest
ASSEMBLYJAVAtools/provision-test-data.ps1 added: sparse checkout of the testdata folder of the .NET repository, the single source of truth for both platforms, linked into the project root as junctionsTest
ASSEMBLYJAVAProvisioning places the GroupDocs.Assembly license in all three locations the tests read it from, so TestSamples runs in full instead of skipping 117 of its 118 tests on “Unexpected EOF in prolog”Test
ASSEMBLYJAVAProvisioning takes the license from the internal license server (GROUPDOCS_LIC_PATH), the way the rest of the GroupDocs Java line does, and checks that what the server answered with is a license before writing it outTest
ASSEMBLYJAVA.NET repository read with a token of its own (ASSEMBLY_TESTDATA_TOKEN) — a CI job token is refused across projects unless the other repository allowlists this oneTest
ASSEMBLYJAVACredentials of the remote kept out of the job log: a token wrapped across two lines is no longer masked by GitLab, so it is removed from the message before it is thrownFix
ASSEMBLYJAVAResources shipped inside aspose-words unpacked into the test classes — com.aspose.ResourceManager resolves them by walking up from the calling package, which only JARJAR bridged, so every test that measures text died in the static initializer of SystemFontProviderTest
ASSEMBLYJAVACoverage reaches SonarQube: imported from the JaCoCo XML report (sonar.coverage.jacoco.xmlReportPaths), the agent no longer overwritten by the hardcoded surefire <argLine>, and the test profile declares build-helper and jacoco of its ownFix
ASSEMBLYJAVASonarQube analysis skips the files carrying the “THIS FILE IS AUTO PORTED” / “THIS FILE IS AUTO GENERATED” marker of the porter — the same logic is analysed as C# in the .NET projectUpdate
ASSEMBLYJAVASonarQube: the reviewed findings of the licensing and enumerator code suppressed in the scanner configuration, each with its reasoning in place, so the ported sources stay identical to the .NET onesUpdate
ASSEMBLYJAVArun_tests runs the suite again instead of -Dqa.skip.junit=true; failing GOLD comparisons do not fail the job while the suite is being brought upUpdate
ASSEMBLYJAVAbuild.cake: the Sonar file regexp written without cmd syntax — the pipe of THIS FILE IS AUTO (PORTED|GENERATED) ended the command line at sonar-scanner.batFix
ASSEMBLYJAVAresources/Cake/api_reference.cake: the declared name of the API reference token used, otherwise the build script does not compile at all and every cake target goes down with itFix
ASSEMBLYJAVAVersion bumped to 26.9 (pom, simplified-pom, AssemblyConstants.VERSION / RELEASE_DATE)Update
ASSEMBLYJAVAArtifact id restored to groupdocs-assembly: the Node.js wrapper build renamed it to groupdocs-assembly-nodejs, and that name reached the release branch, so the package went to a coordinate no client asks forFix
ASSEMBLYJAVAAutomatic-Module-Name: com.groupdocs.assembly declared in the manifest, so the JPMS module name is no longer derived from the file nameUpdate
ASSEMBLYJAVAThird party notices of Aspose.Words, Aspose.Cells and Aspose.BarCode added to META-INF of the jar, together with a notice naming the product, its license and the components it embedsFix
ASSEMBLYJAVALicense URL corrected in both poms and in the EULA pages of the distribution: company.groupdocs.com and company.aspose.com no longer resolve, the live addresses are about.groupdocs.com and about.aspose.comFix
ASSEMBLYJAVAscm element dropped from the poms — git@groupdocs.com/assembly is neither a URL nor an scp location, and the repository behind it is internalUpdate

Aspose components moved to the versions .NET is built against

The GOLD test data is generated by GroupDocs.Assembly for .NET, so the Java build has to use the same Aspose components; until now it was three to six years behind. The reason was the embedded venture license rather than the code: its subscription ran out on 2024-09-18, so every component released later refused it — Words, Email, Slides and BarCode threw, which applyFullLicenses() turned into a bare IllegalStateException, and Aspose.Cells silently kept stamping the evaluation watermark into every spreadsheet it wrote. That last one is a defect a customer could hit with a perfectly valid license.

With the license renewed (subscription until 2027-04-29) Words, Cells, Slides, Email and BarCode are now at the versions the .NET product uses: 26.3, 26.3, 26.2, 26.1 and 26.6. Documents produced by this version therefore differ byte for byte from the ones 26.8 produced, in the ways newer Aspose engines differ — w14:paraId / w14:textId markers on every paragraph, more default attributes on the shape and paragraph properties of presentations, a different set of parts in workbooks. The documented API is unchanged and nothing was removed or renamed.

The embedded Aspose license

The cipher text of the venture license now lives in a resource rather than in the generated code of AsposeLicenseProvider, so renewing it means replacing one file. The key and the initial vector stay in the code, moved into getCryptoKey() and getInitialVector() so that there is a single source of truth. tools/AsposeLicenseResourceGenerator.java takes a .lic, prints the product and the subscription date being embedded, rewrites the resource and verifies the round trip through AsposeLicenseProvider.getBytes(); the procedure is documented in README.md. The subscription of that license remains the upper bound on the Aspose versions this product can carry.

Resources of the repackaged Aspose.Foundation

com.aspose.ResourceManager resolves a resource relative to the package of the calling class, walking up to the parent packages and appending /resources/. JARJAR used to move the Aspose.Words resources into com.groupdocs.assembly.internal.c.a.w.resources, while Aspose.Foundation itself lands in com.groupdocs.assembly.internal.c.a — a parent package, so the lookup never reached them, and every template that needs the font fallback settings failed:

Aspose.Words native libs cannot be loaded. ...
java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalStateException:
    Resurce not found Aspose.Resources.MsOfficeFallbackSetting.xml.

The resources are routed to com.groupdocs.assembly.internal.c.a.resources instead, a parent package for Aspose.Foundation and for the Aspose.Words classes alike. The same defect is present in the released 26.7 and 26.8 JARs.

Barcodes

The barcode fixes of ASSEMBLYNET-60 never made it to Java and are ported here: the code text location of Pdf417, a transparent colour counting as undefined with black and white as the defaults, the minimum dimension of Codabar, and dropping the exception on an image too small for its barcode. Two more are specific to this platform: BarCode needs a minimum dimension for MaxiCode as well, because the Java build gives up at the dimension the product’s own templates produce, and the code text of a valid ITF6 is five digits rather than six.

Tests, GOLD data and licenses

The test documents and the GOLD files live in the .NET repository (groupdocs/bravo/assembly/net, folder testdata) and are the single source of truth for both platforms; TestGoldJava only carries the files where Java differs from .NET. tools/provision-test-data.ps1 keeps a sparse checkout of that one folder on the machine, links TestData, TestGold and TestGoldJava into the project root as junctions, and brings in the licenses — from the internal license server the runners point at with GROUPDOCS_LIC_PATH, or from an ASPOSE_TOTAL_LICENSE / GROUPDOCS_ASSEMBLY_LICENSE file when one is given. The GroupDocs.Assembly license is placed in all three locations the tests read it from (TestData/Licenses/SHA1/, TestData/ and the test classpath), which is what TestSamples needs to run at all.

With the data, the licenses and the current components in place the whole suite runs on the runner: the run_tests job no longer passes -Dqa.skip.junit=true. Failing GOLD comparisons still do not fail the job while the remaining differences between the two platforms are worked through.

The published package

The rest comes from a verification of the published 26.8 package. The manifest carried no Automatic-Module-Name, so on the module path the module name was derived from the file name — precisely what the artifact id above changed; it is declared as com.groupdocs.assembly now. Of the five Aspose components merged into the jar only Slides and Email had their third party notice inside it, the other three being present in the zip distribution alone, and no document in the jar described the product itself; the three missing notices are copied into META-INF next to a NOTICE.GroupDocs.Assembly.txt that names the product, its license and what it embeds. Finally, the license URL of both poms and of the EULA pages shipped in the zip pointed at company.groupdocs.com, which is a CNAME to a CloudFront distribution that no longer exists and does not resolve at all; the same had happened to company.aspose.com in the Aspose EULA next to it. Both point at their about. addresses now.

Coverage and static analysis

Coverage is imported from the JaCoCo XML report now: sonar.jacoco.reportPath with the binary jacoco.exec was dropped by SonarJava 7 and is silently ignored by the 9.9 server this project is analysed on. Two more defects were in the way — the hardcoded surefire <argLine> overwrote the -javaagent of prepare-agent, and the test profile switched off the activeByDefault development one, which is where build-helper-maven-plugin was declared, so mvn test -Ptest did not even compile. Measured with the GOLD data and a license in place, src/main is covered at about 82%.

The analysis itself is now limited to the hand-written Java. Most of src/main/java is produced by JavaPorter from the .NET sources and carries the “THIS FILE IS AUTO PORTED” or “THIS FILE IS AUTO GENERATED” marker; those files cannot be edited on their own without diverging from .NET, and their logic is already analysed as C# in the .NET project, so sonar.issue.ignore.allfile skips them by that marker. What remains — the PAL helpers, FontLoader, NetInputStream, MeteredUtil and friends — is analysed as before, and the findings that were reviewed and accepted (the null guards of the ported code, the volatile caches of the licensing module, the widened integer arithmetic, the IEnumerator semantics of the enumerator adapters) carry their reasoning in the scanner configuration.