Changes
Changes Details
2026-11-06 : added segmented (multi-connection) http downloads : NCp with SAFE (used for every repository download) now fetches large http(s) resources over several parallel Range requests written in place into the pre-allocated
.part~file (NSegmentedHttpDownload), then validates and moves it as before. The first ranged request is the capability probe (no extra round trip) : a 200 (ranges ignored) is consumed as a plain sequential download; later chunks are conditional (If-Range on the ETag/Last-Modified) so a resource changing mid-download, an expired signed url or a server no longer honouring ranges falls back to the regular download; network failures are retried per chunk, resuming from the last received byte; progress is reported as a single stream. Only used when the length is known (HEAD), with no credentials in the url. Configured per copy with the newNCp::segmented(Boolean)(null : workspace default),NCp::segmentedConnections,NCp::segmentedChunkSizeandNCp::segmentedMinSize; workspace defaults come from the custom options---download-connections=<n>(default 4, 1 disables unlesssegmented(true)),---download-chunk-size=<size>(default 4m) and---download-min-size=<size>(default 8m). Measured on a 52MB GitHub release asset (redirected to a signed url) : 28.8s plain, 10.4s segmented (SegmentedDownloadTest)2026-11-06 : fixed
URLPath::exists(http urls) : a HEAD request failing to connect (timeout, refused, unknown host) was retried with a GET, doubling the wait on unreachable hosts, and servers rejecting HEAD (405/501) were reported as missing; connectivity failures are no longer retried and HEAD-less servers are checked with GET (URLPathExistsTest)2026-11-06 : fixed NOpenEnum registration and
NOpenEnum::valuesnot being thread-safe for values created at runtime; values now returns a snapshot2026-11-06 : changed MavenSettingsRepository to parse the --repos selectors once instead of once per sub-repository
2026-11-06 : fixed artifacts rebuilt with an unchanged version (
mvn installwhile iterating on a fixed version) being served with their old descriptor until -N : the maven settings repository (MavenSettingsRepository) cached the descriptors returned by its~/.m2child and never re-checked them; it also copied their jars into its cache and served those copies (the stale~/.cache/nuts/ws/<ws>/repos/maven/*/id/...jars); its local folder children are now read before its cache, for descriptors and content (MavenSettingsRepository::fetchDescriptorImpl,MavenSettingsRepository::fetchContentImpl;NCachedRepository::fetchContentImplis no longer final)2026-11-06 : fixed the effective descriptor cache (
eff-nuts.cache,DefaultNWorkspace::resolveEffectiveDescriptor) being keyed by id only, so a changed raw descriptor with an unchanged version kept its old effective descriptor; a fingerprint (<id> <sha1>of the raw descriptor and of each parent descriptor, recursively) is now stored alongside (eff-nuts-src.cache) and the effective one is recomputed when it differs, so rebuilt parent poms are picked up too2026-11-06 : fixed
NReflectType::declaredMethods/methods exposing synthetic methods (bridges, lambda bodies, agent-injected methods such as JaCoCo's$jacocoInit, which made ReflectGenericsTest fail under the test coverage agent), and field-based properties exposing synthetic fields such asthis$0of inner classes2026-11-06 : added
NSearch::dependsOn/NSearch::addDependsOn/NSearch::clearDependsOn, the--depends-on=<id>search option andNDefinitionFilter::ofDependsOn(NId|String): select artifacts that depend, directly or transitively, on a given artifact whose resolved version (maven mediation : nearest wins, root dependencyManagement and exclusions applied) matches the version filter, e.g.nuts search --latest --depends-on='net.thevpc.ntexup:ntexup-api#[1.1,1.2[' net.thevpc.ntexup:ntexup-extension-shapes2d. Resolution (NDependsOnResolver) walks descriptors only, breadth first, and stops at the first occurrence; an artifact may declare the result itself with thenuts.depends.<groupId>.<artifactId>descriptor property; results are cached in memory only, so they are never staler than the workspace descriptors (artifacts rebuilt with an unchanged version are picked up). Within NSearch, depends-on constraints are kept out of the repository-level filter : with --latest versions are evaluated newest first and the search stops at the first match (latest matching version, instead of resolving every version then keeping the latest)2026-11-06 : changed
NSearch::targetApiVersion/ --api-version (without an exec type) andNDefinitionFilter::ofApiVersionto bedependsOn(net.thevpc.nuts:nuts#<version>); removed NutsAPIDefinitionFilter, which ran a full transitive NFetch for every candidate version2026-11-06 : fixed NDefinitionExecExtensionFilter, NDefinitionExecRuntimeFilter and NDefinitionExecCompanionFilter throwing NullPointerException when built without an api version (
byExtension(null), ...)2026-11-06 : fixed AWT/Swing being loaded on every workspace boot (~200
java.desktopclasses, even fornuts version) :NDependencyFilters::byCurrentDesktop(used by the runnable filter of the boot class loader) is now lazy (NDependencyCurrentDEFilter, the desktop is only detected when a dependency declares a desktop condition),NSysExecUtils::buildEffectiveCommandLocalno longer resolvesNEnv::desktopEnvironmentFamiliesfor plain (non run-as) commands, and NEnvLocal no longer probes the graphical environment eagerly in its initialization2026-11-06 : fixed
NEnvLocal::isGraphicalDesktopEnvironment0returning false when called before any other NEnvLocal getter (its gui field shadowed the NEnvBase one and was only set byinit()), andNEnvLocal::getShell0returning null under the same condition2026-11-06 : fixed NEnvLocal initialization publishing
initialized = truebefore the os/shell/user fields were set, so another thread could read them as null; initialization is now synchronized, with a re-entrance guard for the shell probe that runs NExec2026-11-06 : fixed posix shell version detection in NEnvLocal : the version was read from
$BASH_VERSION/$ZSH_VERSIONinsidesh -c, which describes sh and not the user$SHELL(zsh users got bash's version, dash systems got none); the probed$SHELL --versionline is now used when it does not confirm that value2026-11-06 : fixed URLPath header cache and
URLPath::equals/hashCode being keyed byjava.net.URL, whose equals/hashCode perform a blocking DNS lookup; they now use the url external form, and the shared access-ordered LRU cache is synchronized (concurrent get could corrupt it)2026-11-06 : fixed unsynchronized shared static caches : NLogUtils (level, verb and class name caches), NElementMapperEnum lenient parsers (concurrent
HashMap::computeIfAbsentmay throw ConcurrentModificationException), NHomeLocation and NMsgIntent (read outside their lock) now use ConcurrentHashMap2026-11-06 : fixed
NMetaInfIdResolver::resolvePomVersionleaking thepom.propertiesstream (keeps jar files open, locked on Windows)2026-11-06 : fixed slow workspace boot : MavenSettingsRepository probed
<url>/.nuts-repository(HEAD + GET, with TLS setup) for every extra~/.m2/settings.xmlrepository on every boot, even fornuts version, and could block up to the 30s connect timeout when the network silently drops packets. The probe result is now cached under the workspace cache (maven-settings/*.nuts-repository) for 24h, refreshed by -N/--expire, and never probed when --offline (warm version : ~2.6s -> ~0.5s)2026-11-06 : fixed -N/--expire stale-artifact refresh in DefaultNArtifactExecutable : the auto --reinstall was configured after
NInstall::addId(which snapshots the install flags), so it was never forced and the required dependencies of the executed artifact (e.g. ntexup-engine, ntexup-api, and the libraries reached by NMutableClassLoader imports) were redeployed from their stale installed copies2026-11-06 : added
NElements::fromElement(NElement, Type)andNElements::convert(Object, Type)to deserialize generic targets such asList<MyBean>(usenew NTypeReference<List<MyBean>>(){}.type())2026-11-06 : added
NReflectType::findSuperType(Class)returning the resolved parametrized view of a super class/interface (e.g.Map<String,Integer>forclass Props extends HashMap<String,Integer>)2026-11-06 : fixed NReflectType generics :
superType()/interfaces()of parametrized types, type variables substituted at any depth (nested arguments, arrays, wildcards, owner types), so inherited properties resolve correctly (Leaf extends Mid<Integer>,Mid<X> extends Base<List<X>>)2026-11-06 : fixed
NReflectType::isAssignableFrom(parametrized types and wildcards), toArray (primitives, nested classes, arrays), rawType (no more null for classes), JDK compatible names/equality of synthetic types, NPE in getDeclaredProperty/declaredMethods, thread safe type cache2026-11-06 : fixed element deserialization of generic types : collection/map subclasses (
class PersonList extends ArrayList<Person>), raw concrete maps (TreeMap), Deque/HashSet/BlockingQueue targets,Map.Entryvalue type, generic arrays (List<X>[]), wildcards (List<? extends X>), generic records and Object targets (no more NOptional values)2026-11-06 : added Iterable mapping : non Collection iterables are serialized as arrays (NToElement still honored) and deserialized as collections or through a List/Collection/Iterable constructor
2026-11-06 : fixed NTypeReference equality (two references to the same type are now equal), JDK compatible parametrized type and
NTypeReference.of(List.class, String.class)now buildsList<String>- 2026-11-05 : added support for record creation
- 2026-11-05 : added NMsgSnapshot
- 2026-10-27 : added NText::ntfText
- 2026-10-26 : fixed DefaultNUncompress issue
- 2026-10-23 : fixed Yaml parsing support
- 2026-10-23 : fixed MTF parsing support issues
- 2026-10-23 : fixed NTF parsing support issues
- 2026-10-20 : The re-exec path now preserves the child processβs exit code and restores the interrupt flag if waiting is interrupted.
- 2026-10-20 : fixed Boot issue when similarity explodes
- 2026-10-18 : added NSystemTerminalBase::interruptHandler
- 2026-10-15 : added better Complex number support
2026-10-05 : added cookies support :
NHttpRequest::cookies- 2026-09-26 : boot messages about maven demoted to debug (from warnings)