Property syntax now resolves JavaBean getters: x.Name reads getName(), or isName() for a boolean, when there is no public field of that name.
The keys of a java.util.Map can now be read with member syntax: map.Name reads map.get("Name"), including contextual access such as <<[Name]>>.
row["column"] and row[0] now work on the data rows of JSON, XML and database sources, as do ds["Table"] on a DataSet and x["relation"] on a related row.
Maven metadata standardized: the artifact is named GroupDocs.Assembly for Java, has a short product-specific description, and declares its organization, license and public repository (scm).
修正
Applications that use StAX work again with GroupDocs.Assembly on the class path. Since 26.7 the jar had registered the embedded Woodstox parser as the StAX provider of the JVM under a class name it does not contain, so every XMLInputFactory.newInstance() failed with ServiceConfigurationError: ... Provider com.ctc.wstx.stax.WstxInputFactory not found.
No "Aspose.Words native libs cannot be loaded" lines on System.err any more.
A DataTable renamed with setTableName() is found under its new name, by DataTableCollection.get() and by templates alike.
The items of a List, Set or Map passed directly as a data source are typed by their class instead of Object, so <<foreach [in orders]>><<[Price]>> and orders.sum(c => c.Price) work for a List<Order>.
Members typed by a type variable of a generic class get the type argument of the instance: orders.get(1).Price of a List<Order>, map.get("a").Price of a Map<String, Order>, Optional<Order>.get(), box.getValue() of a Box<Order>, the entries of map.entrySet().
toString(), equals(), hashCode() and getClass() can be called on a value whose type is an interface.
A null java.lang.Boolean counts as false in <<if>>, <<check>>, chart series removal flags and the && and || operators, instead of failing with a NullPointerException.
BarcodeSettings.setResolution() makes barcodes sharper instead of larger: the image carries the requested resolution, and its size in the document stays the size the template gives it.
GroupDocs.Assembly for Java V26.10主要版本2026年10月12日
功能
Indexer syntax obj["key"] works on Java objects. It resolves to a call of get_Item or get with the same arguments, which covers java.util.Map and java.util.List.
build.cake: The security report task prints the tool, its configuration, the project key and the folders it reads and copies the report from, and names the configuration file when no report is produced.
修正
Plain Java objects work as data sources on JDK 16 and later without JVM flags. The generated member binders were defined through a reflective ClassLoader.defineClass, which is refused once java.base/java.lang is closed, so every method of a POJO was reported as "Can not resolve method". They are defined through MethodHandles.Lookup now.
Data models typed by an interface can be used. The generated binders called interface methods with invokevirtual and failed with 'IncompatibleClassChangeError: Found interface ..., but class was expected'.
A JSON object such as root or root.person can be passed to a known-type method that takes a single DataRow.
A java.lang.Boolean value is accepted where a Boolean expression is required: <<if>>, <<check>> and the removal flag of a chart series refused it with "A conditional expression should return a Boolean value".
A presentation chart whose title is deleted no longer brings the assembly down with an internal NullPointerException.
No UnsatisfiedLinkError stack traces logged at SEVERE on Windows on the first render that needs font data. The native library of Aspose.Words cannot bind inside the repackaged jar and is no longer bundled.
GroupDocs.Assembly for Java V26.9主要版本2026年9月18日
功能
Embedded license has been moved out of the generated code into a resource; tools/AsposeLicenseResourceGenerator.java has been restored so that renewing it is a matter of replacing one file.
Bundled Aspose components have been updated to the versions GroupDocs.Assembly for .NET is built against:
Words 23.10 to 26.3.
Cells 20.7 to 26.3.
Slides 20.2 to 26.2.
Email 20.7 to 26.1.
BarCode 20.4 to 26.6.
Adapted to the API of the new components: BarCode EncodeTypes / BaseEncodeType / ITF14BorderType have been moved into the generation package with four symbologies renamed:
Cells FileFormatType.EXCEL_2003_XML to SPREADSHEET_ML.
Slides IImageCollection.addImage(BufferedImage) replaced by PNG bytes.
Email MapiMessage.fromFile() removed.
SonarQube analysis now skips the files carrying the "THIS FILE IS AUTO PORTED" / "THIS FILE IS AUTO GENERATED" marker of the porter - the same logic is analyzed as C# in the .NET project.
SonarQube: The reviewed findings of the licensing and enumerator code are suppressed in the scanner configuration, each with its reasoning in place, so the ported sources stay identical to the .NET ones.
run_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 up.
Version bumped to 26.9 (pom, simplified-pom, AssemblyConstants.VERSION / RELEASE_DATE).
Automatic-Module-Name: com.groupdocs.assembly declared in the manifest, so the JPMS module name is no longer derived from the file name.
scm element dropped from the poms - git@groupdocs.com/assembly is neither a URL nor an scp location, and the repository behind it is internal.
修正
Embedded Aspose venture license renewed - the previous one expired on 2024-09-18, which is what pinned the product to Aspose components of 2020.
Aspose.Cells no longer writes the evaluation watermark into every spreadsheet: 20.7 ignored a current license without a word.
Aspose.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").
Font 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".
Barcodes: code text location of Pdf417.
Barcodes: a transparent color counts as undefined, black and white are the defaults.
Barcodes: minimum dimension of Codabar.
Barcodes: no exception when the image is too small for its barcode.
Barcodes: minimum dimension for MaxiCode - the Java build gave up at the dimension the product's own templates produce, unlike the .NET one.
Barcodes: the code text of a valid ITF6 is five digits, not six.
Thread 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).
Duplicate CultureInfo.xml removed - src/main/resources/com/aspose/words/resources/patched/ was packaged alongside the copy next to it.
Credentials 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 thrown.
Coverage 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 own.
build.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.bat.
resources/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 it.
Artifact 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 for.
Third 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 embeds.
License 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.com.
GroupDocs.Assembly for Java V26.8主要版本2026年9月1日
功能
New project layout - The product is now one Maven module. src/main/java holds the product itself, src/test/java the tests, and res/f the sources shared with other Aspose products (Aspose.Foundation, Aspose.Reporting, the MS layer, Dynabic.Metered and, for tests, Aspose.TestFx with the NUnit shim); they are attached with build-helper-maven-plugin and are documented in res/f/README.md. Build configuration lives in config (JARJAR rules, ProGuard configuration, assembly descriptors, install script templates), redistributable files in res/distribution, non-public third-party JARs in dependencies.
Package renaming: JARJAR instead of the double ProGuard pass - The ANT build ran ProGuard twice - the first pass collected the class name mapping, the mapping was rewritten so that everything outside com.groupdocs.assembly moved under com.groupdocs.assembly.internal, and the second pass applied it. The same result is now produced by JARJAR rules, and ProGuard only obfuscates names. As a side effect the rearrangeJarResources tool is no longer needed: JARJAR moves resources together with their package and rewrites resource path literals inside the class files.
ProGuard specifics that the new pipeline requires - Because renaming now happens before ProGuard, three things had to be adjusted: keep rules must use single-level wildcards (com.groupdocs.assembly.*, not **), string constants holding class names must be adapted (-adaptclassstrings), and the keep rule for reflectively called methods must reference the renamed annotations (@com.groupdocs.assembly.internal.**, since @**aspose** no longer matches anything). In addition, the names of com.groupdocs.assembly.internal.c.a.w.internal.** are preserved: Aspose.Words links its own internal copy of the MS layer against the com.aspose.words.net.System.* wrappers that this project builds from sources, and ProGuard leaves the old class names inside the descriptors of references it cannot resolve.
Aspose.Words without the patched JAR - com.aspose.words.net.System.* is still built from sources, because the classes shipped in the Aspose.Words JAR are obfuscated and miss members used by GroupDocs.Assembly, for example DataSet.readXml(Stream). Instead of un-JARring and patching the artifact, maven-shade-plugin now excludes com/aspose/words/net/** from it, so UpdateAsposeWordsClasses.bat and the Aspose.Words.Classes folder are gone.
Distribution package and manifest - mvn clean install -Prelease (or -Pfinal -Dfinal.skip.packaging=false) produces target/GroupDocs.Assembly_<version>-Java.zip with lib/groupdocs-assembly-<version>.jar, version-substituted lib/install.bat and lib/install.sh, doc/groupdocs-assembly-<version>-javadoc.jar, doc/API, the license agreements and the readme. The ZIP is not attached to the Maven artifacts and is not uploaded by the pipeline (the deploy jobs run -Pfinal without -Dfinal.skip.packaging=false), so publishing it stays a manual step, as it was with the ANT build. Note that the archive is named GroupDocs.Assembly_<version>-Java.zip and unpacks into a GroupDocs.Assembly_<version> folder, while the ANT build produced groupdocs-assembly-<version>-java.zip with lib, doc and license at the root. The JAR manifest (Specification/Implementation, OSGi Bundle-*, Permissions, Codebase, Export-Package) is produced by maven-jar-plugin, so the build no longer runs ManifestGenerator.
Tests and test data - GOLD tests locate their documents by walking up from target/test-classes for a directory that contains both TestData and TestGold (TestGold paths are then replaced with TestGoldJava when a Java specific GOLD file exists). Those folders total 232 MB and are not part of the repository, so the run_tests job currently runs with -Dqa.skip.junit=true and Sonar analysis without coverage; drop the flag once the folders are provided on the runner. Tests also need real .lic files (Aspose.Total Product Family.lic next to TestData, and the GroupDocs.Assembly licenses inside TestData).
API reference - mvn initialize -Pjavadoc generates the Hugo reference for the website; the final and release profiles build the javadoc JAR with the standard doclet and the overview page from res/javadoc. Note that the reference is generated from the sources of the com.groupdocs.assembly tree, which carry .NET style /// comments, so it currently contains signatures without descriptions - the ANT build fed javadoc with intermediate sources produced by the .NET CommentPorter tooling, which is not a part of this project. For the same reason the public .NET analogue types (com.groupdocs.assembly.system.data and friends) are not covered: they only get that name from JARJAR at build time.
GroupDocs.Assembly for .NET V26.7主要版本2026年7月19日
功能
Upgraded document generation engines.
修正
Template expressions could not use members inherited from a base interface.
Custom KnownTypes function taking a single DataRow was not resolved from a JSON object node.
GroupDocs.Assembly for Java V26.7主要版本2026年7月13日
修正
JsonDataSource: Array elements silently dropped when the same field name is reused on a different JSON path.
GroupDocs.Assembly for .NET V26.6主要版本2026年6月30日
功能
NuGet package has been split into per-target-framework runtime packages (adds .NET 8 and .NET 10).
Upgraded the underlying document generation engines.
修正
Resolved System.Formats.Asn1 security advisory.
UTC (Z) dates shifted by host timezone when parsed from JSON.
GroupDocs.Assembly for Java V26.6主要版本2026年6月30日
修正
UTC (Z) dates shifted by JVM timezone when converted to java.util.Date.