GroupDocs.Assembly for Java 26.8 Release Notes
Full list of changes in this release
| ID | Summary | Category |
|---|---|---|
| ASSEMBLYJAVA | Project converted from IntelliJ IDEA modules + ANT release script to a single Maven project with the shade → jarjar → proguard pipeline | Update |
| ASSEMBLYJAVA | Product sources moved to the standard Maven layout: GroupDocs.Assembly, Aspose.{Words,Cells,Slides,Text}.Assembly, Aspose.Foundation.Extensions, Dynabic.Metered, MS.Patched → src/main/java (209 files) | Update |
| ASSEMBLYJAVA | Shared sources vendored to res/f/src/main/java: Aspose.Foundation, Aspose.Reporting, MS layer (com.aspose.ms, com.aspose.words.net.System.*, WindowsNativeCall), shared Dynabic.Metered (2007 files) | Update |
| ASSEMBLYJAVA | Licensing resources → src/main/resources/com/groupdocs/assembly; CultureInfo.xml → src/main/resources/com/aspose/words/resources (former MS.Patched resource root) | Update |
| ASSEMBLYJAVA | pom.xml with profiles development / final / release / javadoc / test / test-obfuscated / sonar / deploy-groupdocs-qa / deploy-groupdocs | Feature |
| ASSEMBLYJAVA | Package renaming: the two-pass ProGuard mapping trick replaced by JARJAR (21 rules; config/groupdocs-assembly.rules mirrors the pom) | Update |
| ASSEMBLYJAVA | Public .NET analogue API preserved: com.aspose.words.net.System[.Data[.Common]] → com.groupdocs.assembly.system[.data[.common]]; System.Globalization moved to internal | Fix |
| ASSEMBLYJAVA | rearrangeJarResources post-processing dropped — JARJAR rewrites resource path literals (/com/aspose/email/tz.dat → internal path) | Update |
| ASSEMBLYJAVA | Aspose.Words patched-JAR step dropped (UpdateAsposeWordsClasses.bat, Aspose.Words.Classes): shade excludes com/aspose/words/net/** of the artifact | Update |
| ASSEMBLYJAVA | Aspose.Words transitives excluded: -javadoc, -shaping-harfbuzz-plugin, jogl/gluegen natives (~200 MB) | Fix |
| ASSEMBLYJAVA | Third-party JARs that are not published (patched bc-fips, Woodstox, PngEncoder, JAI, im4java) moved to the project-local repository ./dependencies | Update |
| ASSEMBLYJAVA | JAI and im4java declared provided — compiled against, not merged into the result JAR | Update |
| ASSEMBLYJAVA | Manifest produced by maven-jar-plugin manifestEntries (replaces the ManifestGenerator run of the ANT build) | Update |
| ASSEMBLYJAVA | ProGuard configuration ported to config/groupdocs-assembly.pro; optimization disabled | Update |
| ASSEMBLYJAVA | ProGuard keep rules use single-level wildcards, otherwise everything JARJAR moved under com.groupdocs.assembly.internal stays unobfuscated | Fix |
| ASSEMBLYJAVA | ProGuard -adaptclassstrings com.groupdocs.assembly.internal.**: Aspose components load internal classes by name and ProGuard 7 does not adapt such string constants | Fix |
| ASSEMBLYJAVA | ProGuard keeps methods annotated with the renamed engine annotations @com.groupdocs.assembly.internal.** — otherwise CustomTypeMemberBinderBuilderImpl fails in its static initializer | Fix |
| ASSEMBLYJAVA | ProGuard -keepnames class com.groupdocs.assembly.internal.c.a.w.internal.**: Aspose.Words links its internal MS-layer copy against the net.System wrappers built from sources | Fix |
| ASSEMBLYJAVA | ManifestGenerator excluded from the public API by the ProGuard keep rule and from the API reference | Update |
| ASSEMBLYJAVA | Distribution ZIP built by maven-assembly-plugin (config/assembly.xml): lib/JAR + install.bat/sh with the substituted version, doc/javadoc JAR + doc/API, licenses, readme | Update |
| ASSEMBLYJAVA | simplified-pom.xml published instead of the build pom; deploy profiles for the QA and production S3 repositories | Update |
| ASSEMBLYJAVA | Compiler level unified to 1.8 (was 1.7 for the product and 1.8 for the tests) | Update |
| ASSEMBLYJAVA | Tests moved: Aspose.TestBase, GroupDocs.Assembly.Tests, Aspose.*.Assembly.Tests, GroupDocs.Assembly.SampleTests → src/test/java (58 files) | Test |
| ASSEMBLYJAVA | Shared test infrastructure to res/f/src/test/java: Aspose.TestFx and the com.aspose.ms.NUnit.Framework shim (70 files) | Test |
| ASSEMBLYJAVA | Sample test documents → src/test/resources/com/groupdocs/assembly/sampletests/TestData (121 files) | Test |
| ASSEMBLYJAVA | xmlunit:xmlunit:1.2 test dependency added for com.aspose.XmlComparer of Aspose.TestFx | Test |
| ASSEMBLYJAVA | surefire/failsafe include Test*, **Test, **Tests and exclude the test infrastructure (com/aspose/Test*, com/aspose/testbase/**, com/aspose/ms/NUnit/**) that holds no tests | Test |
| ASSEMBLYJAVA | testng.xml suite added for the test-obfuscated profile (tests against the obfuscated JAR, the analogue of the ANT test.project target) | Test |
| ASSEMBLYJAVA | Obfuscated JAR verified against the JAR of the old ANT build: DOCX/XLSX produce output of the same size, EML/MSG/PPTX produce identical messages | Test |
| ASSEMBLYJAVA | run_tests: unit tests skipped with -Dqa.skip.junit=true until TestData/TestGold/TestGoldJava are available on the runner | Update |
| ASSEMBLYJAVA | run_tests: the -D option quoted — PowerShell 5.1 splits -Dqa.skip.junit=true into -Dqa + .skip.junit=true and Maven fails with “Unknown lifecycle phase” | Fix |
| ASSEMBLYJAVA | .gitlab-ci.yml: dev/test/stage/prod/cleanup pipeline (Sonar, security report, QA and prod deploy, API references, build dir cleanup) | Update |
| ASSEMBLYJAVA | build.cake: Sonar keys and exclusions for assembly, security report, GitHub API references, CleanupBuildDir; the UpdateBlackLists task dropped (blacklists are generated into the sources) | Update |
| ASSEMBLYJAVA | build.cake SecurityReport: warn instead of failing the pipeline when the tool produced no report for the project | Fix |
| ASSEMBLYJAVA | javadoc profile (HugoDoclet): -overview is no longer passed — the flag is added by maven-javadoc-plugin outside the standard doclet options and the doclet rejects it | Fix |
| ASSEMBLYJAVA | javadoc: <subpackages> replaced with <sourceFileIncludes> — with -subpackages the javadoc tool of JDK 9+ dies with java.lang.AssertionError in com.sun.tools.javac.comp.Modules.allModules | Fix |
| ASSEMBLYJAVA | javadoc: overview page taken from res/javadoc/javadoc.overview.html for the standard doclet builds | Update |
| ASSEMBLYJAVA | README rewritten: build description, mapping of the old modules onto the new layout, JARJAR/ProGuard specifics, test data and license requirements | Update |
| ASSEMBLYJAVA | res/f/README.md added: origin of every shared source subtree and how to update it | Update |
| ASSEMBLYJAVA | Version bumped to 26.8 (pom, simplified-pom, AssemblyConstants.VERSION/RELEASE_DATE) | Update |
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.