-
Notifications
You must be signed in to change notification settings - Fork 963
Expand file tree
/
Copy pathCHANGES.txt
More file actions
3959 lines (2774 loc) · 152 KB
/
Copy pathCHANGES.txt
File metadata and controls
3959 lines (2774 loc) · 152 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Release 4.1.0 - unreleased
* Pipes now records per-stage timings. Each PipesResult carries an optional
StageTimings (fetch/parse/emit/server-wall nanos) stamped by the forked
worker, and PipesClient emits one TSV-friendly line per parse on logger
org.apache.tika.pipes.timing (INFO; off unless enabled in the parent
process's log config) covering client wait, init, request serialize/write,
server wait, the server stages, and client total. Overhead is negligible
when the logger is disabled. Note for binary compatibility: the canonical
PipesResult constructor gained the serverTimings component; the previous
three-argument constructor remains (TIKA-4835).
* tika-server and tika-async-cli now start from a config that contains
// or /* */ comments, as the configuration docs have always said they
may. The main loader accepted them; the steps that re-read the user's
file to merge in server/CLI overrides (ConfigMerger, ensurePluginRoots)
used their own bare parser and refused the whole file; they now use the
shared TikaObjectMapperFactory mapper (TIKA-4834).
* The Kafka pipes iterator no longer stops at the first empty poll. A newly
subscribed consumer spends its first poll(s) joining the group and returns
empty even when the topic has a backlog, so the iterator could enqueue zero
files and report success. It now waits for a partition assignment (bounded
by the new assignmentTimeoutMs, default 30s) and requires a continuous quiet
window (drainIdleMs, default 1s) before concluding the topic is drained.
groupInitialRebalanceDelayMs is deprecated and no longer sent to the
consumer: it is a broker setting that Kafka has always ignored (TIKA-4833).
* Pipes IPC: carry inline document bytes as a raw binary field beside the
tuple in the request envelope -- never inside the tuple or its
ParseContext -- and disable Smile's 7-bit binary encoding. Tuple JSON
serialized by 4.0.0 with an "inline-bytes" parse-context entry no longer
loads; it is rejected with a tailored message (TIKA-4829).
* Digesting embedded documents no longer buffers each embedded object to a
temp file. Zip entries are re-read from the parent archive on rewind, and
a new process-wide CacheMemoryBudget (seeded by the pipes forked server;
default 256MB, clamped to a quarter of the fork's heap; tunable via
-Dtika.pipes.cacheMemoryBudgetBytes in the config's forkedJvmArgs, <=0
disables) lets embedded objects stay in memory past the per-object 1MB
threshold. New public API on TikaInputStream: get(IOSupplier,...),
enableRewind(CacheMemoryBudget), getSeekableByteChannel(). Zip/7z/epub/odf
parsing and zip container detection now read through seekable channels, so
after detection/parsing a TikaInputStream may no longer be file-backed
(hasFile() false); getPath()/getFile() still work and spool on demand
(TIKA-4828).
* Pipes now carries the caller-supplied Content-Type across the worker's
fresh-metadata boundary as a soft detection hint, so every forked-parse
endpoint (/tika, /meta, /rmeta, /unpack, /async, /pipes, plus tika-grpc
and embedded PipesForkParser) can route on a client Content-Type, not
only on the filename. Detection keeps the hint only when it equals or
specializes the content-detected type (e.g. refining image/tiff to
image/x-canon-cr2); for bytes with no magic it can select any type,
matching the routing power the filename already had. The
CONTENT_TYPE_USER_OVERRIDE key is deliberately not carried, so the hint
cannot force an unrelated type (TIKA-4825).
* OneNote extraction now follows document order, omits superseded page
revisions, sorts author metadata, extracts embedded object BLOBs, and
bounds malformed-input recursion and file-derived allocations. Parse
warnings and embedded relationship IDs are exposed in metadata. Malformed
or truncated files that cannot be fully parsed, and files whose walk
yields no content, now fall back to the legacy string dump instead of
failing or returning empty output. The legacy MS-ONESTORE walker bounds
its recursion (depth caps plus file-node-list and fragment-chain cycle
guards) and now honors shouldParseEmbedded for embedded file data
(TIKA-4814).
* RawTiffParser extracts the camera-generated JPEG previews embedded in
TIFF-based raw images (Nikon NEF/NRW, Sony ARW/SRF/SR2, Pentax PEF/PTX,
Adobe DNG and Canon CR2, including BigTIFF DNG containers) as thumbnail
embedded documents. image/x-raw-{nikon,sony,pentax,adobe} are now
sub-classes of image/tiff, so a named NEF/ARW/PEF/DNG that used to detect
as image/tiff (TiffParser, metadata only) now detects as image/x-raw-* and
emits thumbnail-N.jpg attachments in /rmeta and /unpack; CR2 keeps its
detection but also gains the attachments. Disable via
"raw-tiff-parser": {"extractPreviews": false} (TIKA-4824).
Release 4.0.0 - 8/18/2026
This section is the complete delta from 3.x. It includes everything first
released in 4.0.0-alpha-1 and 4.0.0-beta-1; those sections below are stubs.
Upgrading from 3.x? Start with the migration guides at
https://tika.apache.org/docs -- "Migrating to Tika 4.x", "Migrating Tika
Server to 4.x" and "Metadata Changes in Tika 4.x". They carry the detail
and the code examples behind the summaries here.
Important architectural change: parsing now runs in a forked process
where possible. tika-server's endpoints, tika-app's -a/--async and -f/--fork,
and tika-grpc all parse in forked, crash-isolated tika-pipes workers.
Applications embedding Tika should consider getting the same isolation from
PipesForkParser (tika-pipes-fork-parser) rather than parsing in-process with
AutoDetectParser. Note that the project does not treat denial of service --
memory exhaustion, CPU exhaustion, a crashed process -- as a security issue
when files are parsed outside these isolated paths; see
https://tika.apache.org/security-model.html.
BREAKING CHANGES
--- Platform, packaging, configuration and output format (everyone) ---
* Tika 4.x requires Java 17 or later; 3.x built and ran on Java 11. All
published artifacts are compiled with --release 17 (TIKA-4685).
* tika-app and tika-server-standard now ship as zip distributions with an
adjacent lib/ directory; the published jars are thin launchers and fail
with NoClassDefFoundError if run on their own. This catches
tika-server-standard hardest, because its jar is still on Maven Central:
unzip the distribution and run from inside it (TIKA-4733).
* tika-parsers-standard-package is now a pom, not a jar. Users must add
<type>pom</type> in Maven or @pom in Gradle (TIKA-4712).
* The default content handler is now Markdown. tika-app, tika-server (the
/tika and /rmeta endpoints) and the async/pipes CLI emit Markdown content
by default instead of XHTML/XML (plain text for the async CLI). Request
the previous format explicitly: tika-app -x/--xml, the server's /tika/xml
and /rmeta/xml paths, the async CLI --handler x (TIKA-4663).
* Configuration moved from XML to JSON. TikaConfig and the
org.apache.tika.config XML-configuration API are removed: TikaConfig,
ConfigBase, Field, Param, ParamField, LoadErrorHandler,
InitializableProblemHandler, TikaConfigSerializer and TikaTaskTimeout are
gone. Use TikaLoader from tika-serialization. tika-app
--convert-config-xml-to-json converts a 3.x parsers section as a starting
point; every other section needs manual migration
(TIKA-4544, TIKA-4545, TIKA-4553, TIKA-4565).
* An unregistered component name in a default-parser, default-detector or
default-encoding-detector "exclude" list now throws a TikaConfigException
at config load instead of logging a WARN, so a 3.x config that named the
component by class name or misspelled it now refuses to start. Use the
registered name (e.g. "pdf-parser"); tika-app --list-parser-names prints
them (TIKA-3268, TIKA-4808).
* Metadata keys were renamed for consistency and provenance. Every
Tika-asserted key now lives under a single tk: prefix, replacing 3.x's
scattered X-TIKA:, tika:, tika_pg:, rendering:, signature: and
imagereader: prefixes and bare names such as resourceName; names Tika
coined inside format namespaces are kebab-cased (pdf:hasMarkedContent ->
pdf:has-marked-content) while names from a file or an external standard
keep their spelling; and open key families gained prefixes (audio:, ner:,
envi:, ogg:streams-, grobid:, iso19115:, gdal:, geotopic:, mif:, idml:).
Code using the TikaCoreProperties / TikaPagedText / Rendering constants is
unaffected. Code that references keys by String has two paths: update the
strings with the key-for-key tables in metadata-changes-4x.adoc, or turn
on the compatibility filter below and migrate on your own schedule
(TIKA-4816).
* The opt-in legacy-key-migration-filter restores 3.x key spellings at the
emit edge (default direction V4_TO_V3), so an unmigrated consumer keeps
working against 4.x output; V3_TO_V4 maps 3.x names forward instead.
tika-core bundles metadata-migration-3x-4x.json, the machine-readable
rename/drop table (TIKA-4797).
* The reserved tk: (and legacy X-TIKA:) namespace is now a trust boundary
for String-keyed writes. Metadata#set/add(String, String) throw
IllegalArgumentException on a reserved key instead of 3.x's silent
success, where a document-controlled property named X-TIKA:Parsed-By could
overwrite Tika's own value, and Property's public factories reject reserved
names outright. Document- and tool-derived names now go through
Metadata#add(KeyPrefix, String, String) -- append-only, skip-and-WARN on
hostile names -- or its Instant overload for source-typed dates
(TIKA-4816).
* Metadata no longer implements CreativeCommons, Geographic, HttpHeaders,
Message, ClimateForcast, TIFF or TikaMimeKeys: inherited constants move to
their home interface, e.g. Metadata.CONTENT_TYPE becomes
HttpHeaders.CONTENT_TYPE (now a Property, though the key string is
unchanged). TikaMimeKeys and
ClimateForcast are deleted outright; ClimateForecast (corrected spelling)
replaces the latter, with its keys under cf: (TIKA-4816).
* Other Metadata API changes: setAll(Properties) removed with no replacement
-- it bypassed both the limiter and the reserved-key guard, so use
putAll(Metadata) or individual set/add calls; PassthroughPrefix renamed
KeyPrefix; the Property factories internalClosedChoise / internalOpenChoise
/ externalClosedChoise / externalOpenChoise renamed to ...Choice with no
forwarders; the dead enum constants PropertyType.STRUCTURE and
ValueType.{LOCALE, MIME_TYPE, PROPER_NAME, URL, XPATH} removed; package
org.apache.tika.metadata.writefilter renamed to ...metadata.writelimiter.
Metadata's serialVersionUID also changed, so a 3.x-serialized instance now
fails with InvalidClassException instead of deserializing into an object
that throws on first write (TIKA-4816).
--- Java API (library integrators) ---
* The core SPI signatures changed. Parser.parse takes a TikaInputStream
instead of an InputStream (there is no InputStream overload),
Detector.detect takes (TikaInputStream, Metadata, ParseContext), and
EmbeddedDocumentExtractor's shouldParseEmbedded/parseEmbedded gained a
ParseContext and take a TikaInputStream. Every third-party implementation
must be updated; callers can wrap with TikaInputStream.get(...). The Tika
facade still accepts an InputStream, but Tika.detect(InputStream, ...) no
longer returns the caller's stream at its original position. The detector
still resets the TikaInputStream it reads -- but that read-ahead is
buffered inside an internal wrapper that detect() discards, so the
caller's own stream comes back advanced. Pass a TikaInputStream you own
(and rewind it), or re-open the source
(TIKA-4399, TIKA-4541, TIKA-4569).
* TikaInputStream no longer caches by default. A stream is consumed in
passthrough mode unless enableRewind() is called at position 0;
rewind()/getFile()/getPath() after reading without enableRewind() throw
instead of silently spooling. A parser that read part of a stream and then
asked for a file worked in 3.x and now fails. Digesters call
enableRewind() themselves (TIKA-4618, TIKA-4623).
* Parsing with a concrete parser (not AutoDetectParser) and an empty
ParseContext no longer auto-generates an AutoDetectParser to handle
embedded files: they are silently skipped, with no content and no
exception. Nor does it auto-generate a Detector to identify them; they are
reported as application/octet-stream instead. Set Parser.class and
Detector.class in the ParseContext, or go through AutoDetectParser, which
does this for you (TIKA-4819).
* EmbeddedDocumentExtractorFactory and friends are removed;
ParsingEmbeddedDocumentExtractor and UnpackExtractor are now stateless
singletons (use INSTANCE) that take the enclosing ParseContext as a method
parameter rather than capturing one at construction. Code that supplied a
custom factory should bind an EmbeddedDocumentExtractor instance directly.
EmbeddedDocumentUtil's instance API is likewise removed in favor of statics
that take a ParseContext explicitly (TIKA-4819).
* ParseContext configuration is now resolved per component instance rather
than per config class, because a class-keyed write leaked one component's
config to every other component binding the same config class. Two
consequences: parseContext.get(SomeConfig.class) no longer returns a
JSON-resolved config, so a third-party component following the
PDFBoxRenderer pattern must be handed its config explicitly; and precedence
is inverted -- a JSON config now beats a programmatic
context.set(XConfig.class, ...), which used to win (TIKA-4808).
* ForkParser and the entire org.apache.tika.fork package are removed from
tika-core. Out-of-process parsing is now provided by PipesForkParser in
the new tika-pipes-fork-parser module -- the recommended parser for
untrusted documents. tika-app's -f/--fork routes through it, and
--fork-timeout is rejected rather than silently ignored
(TIKA-4554, TIKA-4571, TIKA-4651).
* Unified timeout model across the library, pipes and server: a total-task
budget plus a progress/stall timeout, composed recursively over embedded
documents. TikaTimeoutException is now a checked exception, and several
parser/pipes config fields were renamed (*TimeoutSeconds / *TimeoutMs ->
*TimeoutMillis, including a unit change for Tess4J) (TIKA-4813).
* Parsers and detectors no longer expose bean setters/getters for their
settings. Configuration moves to per-component *Config objects supplied
through the ParseContext (e.g. GeoParserConfig, DWGParserConfig,
AmazonTranscribeConfig, MagikaDetector/SiegfriedDetector configs)
(TIKA-4758).
* The encoding detectors moved out of parser packages into
org.apache.tika.detect.* and into new tika-encoding-detector-* modules:
org.apache.tika.parser.txt.{CharsetDetector,CharsetMatch,
Icu4jEncodingDetector,UniversalEncodingDetector,BOMDetector,...} are now
org.apache.tika.detect.icu4j.*, org.apache.tika.detect.universal.* and
org.apache.tika.detect.BOMDetector, and
org.apache.tika.parser.html.HtmlEncodingDetector is now
org.apache.tika.detect.html.HtmlEncodingDetector.
NonDetectingEncodingDetector is removed (TIKA-4685, TIKA-4720).
* MetadataListFilter has been renamed MetadataFilter, and the 3.x
MetadataFilter has been removed (TIKA-4546).
* API changes in the EmbeddedStreamTranslator (TIKA-4518), and
DigestingParser is removed (TIKA-4607).
* BasicContentHandlerFactory.parseHandlerType now throws
IllegalArgumentException for an unrecognized handler name instead of
silently returning the supplied default (TIKA-4809).
--- tika-server ---
* All parsing now runs out-of-process through tika-pipes. /tika, /rmeta,
/meta, /unpack, /detect, /pipes and /async share a fixed pool of
numClients forked worker JVMs (default derived from host cores), so a
parser crash, OOM or timeout no longer takes down the server. The cost is
a sizing decision 3.x never asked of you: numClients is both the server's
concurrency ceiling and its CPU/memory footprint, and each fork's heap is
set with pipes.forkedJvmArgs (e.g. -Xmx1g), not the server JVM's. Size
both deliberately; see the cpu-sizing docs (TIKA-4809).
* Capability flags are default-deny and split in two. enableUnsecureFeatures
no longer exists -- a config still carrying it fails to start with an
"Unrecognized field" error -- and is replaced by allowPipes (gates /pipes
and /async) and allowPerRequestConfig (gates the /config endpoints and the
multipart config part). /status is no longer gated and is enabled simply
by listing it under endpoints. tika-grpc gains
the same allowPerRequestConfig flag plus allowComponentModifications, which
gates runtime Save/Delete of fetchers and pipes iterators (TIKA-4764).
* Endpoints removed: /translate/* (unusable as shipped), /tika/main and
/tika/form/main (Boilerpipe; use /tika/text), and the /tika/form family.
The 3.x /tika/config and /tika/form/config forms are replaced by the
/tika/config* multipart POSTs, which require allowPerRequestConfig
(TIKA-4809).
* Endpoints collapsed: /detect/stream is now /detect, and /language/stream
and /language/string are both /language. Behavior changed with the rename:
/detect now runs in the fork pool, so it can return 429, 503 or 413, and a
failure reading the body is a 500 where 3.x returned 200 with
application/octet-stream as if detection had succeeded; /language caps
input at the first 100,000 characters and uses the default LanguageDetector
on the classpath, where 3.x pinned Optimaize (TIKA-4809).
* Output-format routing on /tika changed. The bare /tika endpoint returns
Markdown (was XHTML); use /tika/xml for XHTML. /tika/text is body-only
again, as in 3.x. /tika/json and /tika/config/json default to the server
default (markdown) rather than hardcoded plain text. The Accept header no
longer selects the output format -- 3.x routed bare /tika among plain
text, HTML and XHTML by Accept (nondeterministically for */*); now the
path names the format. An unrecognized handler name in the path is a 400
listing the valid types, instead of silently falling back to the default
(TIKA-4663, TIKA-4809).
* Per-request configuration headers are removed, and are now silently
ignored if sent: writeLimit, throwOnWriteLimitReached,
maxEmbeddedResources/maxEmbeddedCount, X-Tika-Handler and the meta_*
metadata-injection family. The limits move to parse-context
(output-limits.writeLimit, output-limits.throwOnWriteLimit,
embedded-limits.maxCount); X-Tika-Handler becomes an explicit handler path;
meta_* has no replacement, and with per-request config off by default a
caller can no longer bound the output of a single request. The
X-Tika-OCR* and X-Tika-PDF* families were removed earlier in the 4.x line
(TIKA-4809).
* Caller errors now map to accurate HTTP status codes instead of always
returning 200 or 500. A saturated worker pool returns 429, a
crashed/timed-out/OOM worker returns 503, an unknown or reserved
fetcher/emitter or bad handler returns 400, and an over-limit body returns
413; the 429 and 503 responses carry a Retry-After header. Error bodies are
now JSON ({"status":"TIMEOUT"}, with a message field when one is
available) where 3.x returned plain text such as "Parse failed: TIMEOUT"
(TIKA-4809).
* The raw /tika family's 422 responses carry the extracted content only; the
exception is no longer appended to the body -- use /rmeta for the
structured exception (TIKA-4809).
* /meta now runs through the same pipes-backed parser as the other
extraction endpoints, so it gains their crash isolation and their error
handling: a container exception comes back as 200 with
tk:exception:container-exception instead of 500, and /meta/{field} returns
422 instead of 500 or 400. A request with no Accept header now returns
JSON; 3.x returned CSV, still available via Accept: text/csv. /meta also no
longer returns a language field -- it parses with the ignore handler, so
there is no text to detect from; configure a language-detection metadata
filter and use /rmeta or /tika/json instead (TIKA-4809).
* /async requires an object body {"tuples":[...]} instead of a bare JSON
array, validates fetcher/emitter ids at POST time (400), rejects a batch
larger than the queue's total capacity with 400 instead of throttling it,
and one bad tuple no longer stops the async workers. /pipes returns the
same JSON body as /tika/rmeta/unpack -- {"status":<RESULT_STATUS>,
"message":...} -- instead of a /pipes-only {"status":"ok"|"process_crash"}
shape, returns 400 with the reason for a malformed request body, and
rejects emit strategies other than EMIT_ALL, whose passed-back data the
/pipes response cannot carry (TIKA-4809).
* Many server config keys were removed or renamed (logLevel, idBase,
digest, returnStackTrace, port ranges, the spawn-child options, ...), and
an unrecognized key now fails startup with an error naming it; see
migrating-tika-server-4x.adoc for the key-by-key migration. One change no
startup error will flag: taskTimeoutMillis is now
parse-context.timeout-limits.totalTaskTimeoutMillis, and its default grew
from 5 minutes to 1 hour (TIKA-4809, TIKA-4813).
* Request bodies are now capped by maxRequestSizeBytes, defaulting to 1 GiB;
larger requests are rejected with 413, including over-limit chunked
uploads, which previously surfaced as an empty 500 (TIKA-4809).
* The 'endpoints' allowlist now also gates SPI-provided resources; a
discovered resource binds only when its root endpoint is enabled
(TIKA-4809).
* Fetcher-based streaming is removed: the InputStreamFactory pattern for
fetching documents via the fetcherName/fetchKey headers is gone, and all
documents now go through the pipes infrastructure. The no-op
-a/--pluginsConfig flag is removed and now fails option parsing, --help
exits 0, and the tika-server-client module is removed (TIKA-4809).
--- tika-pipes and tika-grpc ---
* tika-pipes implementation modules are now pf4j plugins, reorganized by
resource (tika-pipes-solr) vs task (tika-pipes-fetcher-solr). Core classes
moved to tika-pipes-core, and the file-system components moved out of it
into their own tika-pipes-file-system plugin
(TIKA-4334, TIKA-4519, TIKA-4543).
* FetchEmitTuple JSON now names the per-tuple parse context "parse-context"
(was "parseContext") and rejects unknown tuple fields with an error naming
the field (TIKA-4809).
* The pipes config keys staleFetcherTimeoutSeconds and
staleFetcherDelaySeconds have been removed; a config still carrying them
fails startup (TIKA-4809).
* TimeoutLimits: progressTimeoutMillis of 0 combined with a positive
totalTaskTimeoutMillis is now rejected at config load; it would kill
every task immediately (TIKA-4809).
* The http-fetcher now verifies TLS certificates and hostnames by default;
set verifySsl:false to opt out (TIKA-4809).
* SolrJ moves from 8.11.4 to 10.0.0; the Solr fetcher, emitter and pipes
iterator no longer support Solr 8 (TIKA-4789).
* tika-grpc: the generated Java classes moved from package org.apache.tika
to org.apache.tika.pipes.grpc.proto, so every generated type moves and Java
gRPC clients must update their imports. This is a source break only: the
proto package ("tika") and the service name ("Tika") are unchanged, so the
wire protocol is identical and clients in other languages are unaffected
(TIKA-4808).
--- tika-app and tika-eval-app ---
* tika-app's batch mode is gone. The -bc/batch directory-to-directory command
line (backed by the removed tika-batch module) has no successor flag; use
-a/--async, which runs the same work through tika-pipes
(TIKA-4333, TIKA-4340).
* tika-core/tika-app: NetworkParser and tika-app's -c/--client=<uri>
network-client mode were removed -- they dispatched raw sockets to an
arbitrary user-supplied host with no auth or TLS. Use tika-server
instead (TIKA-4808).
* tika-eval-app's command line changed: the FileProfile sub-command is
removed, the -bc batch-config option is gone, and extract directories are
now named with -e/--extracts (Profile) and -a/--extractsA + -b/--extractsB
(Compare); -i/--inputDir, -d/--db, -c/--config, -n/--numWorkers and
-m/--maxExtractLength replace the 3.x spellings
(TIKA-4342, TIKA-4450, TIKA-4452, TIKA-4507).
* tika-app: the inline short forms -eX (output encoding) and -pX (document
password) were removed from standard mode; use --encoding=X and
--password=X. Prefix-matching them silently swallowed single-dash long
names, so every single-dash long name is now rejected with a message
naming the two-dash form (TIKA-4808).
--- Parser, detector and output behavior ---
* The tika-langdetect-tika module is removed (TikaLanguageDetector,
LanguageIdentifier, LanguageProfile, LanguageProfilerBuilder,
ProfilingWriter). tika-app, tika-server and tika-eval now bundle the new
CharSoup detector (tika-langdetect-charsoup) instead of
tika-langdetect-optimaize, so the language reported by default changes
(TIKA-4662).
* PDF: extractIncrementalUpdateInfo now defaults to true (was false), so
every PDF parse emits pdf:incremental-update-count and related keys
without configuration. parseIncrementalUpdates remains false
(TIKA-4354, TIKA-4358).
* Audio cover art is now extracted as embedded documents from MP3 (ID3v2
APIC/PIC), MP4 (covr), Vorbis and FLAC. Embedded-document counts and
/rmeta list lengths for audio files change (TIKA-4801).
* The DOM-based OOXML extractors are removed (XWPFWordExtractorDecorator,
XSLFPowerPointExtractorDecorator, POIXMLTextExtractorDecorator,
XPSTextExtractor) and with them the OfficeParserConfig keys
useSAXDocxExtractor and useSAXPptxExtractor. The SAX extractors are the
only implementation (TIKA-4692, TIKA-4708).
* The MuPDF renderer is removed (org.apache.tika.renderer.pdf.mutool); PDF
page rendering for OCR now uses the PDFBox renderer or the new
PopplerRenderer (TIKA-4664).
* The legacy ExternalParser is removed; external parsers now require explicit
JSON configuration. CompositeExternalParser and ExternalParsersFactory,
which loaded tika-external-parsers.xml definitions from the classpath
automatically, are gone (TIKA-4707).
* Headers are no longer injected into the body/content of MSG files
(TIKA-4345). Please open a ticket if you need this behavior across email
formats.
--- Removed modules and classes ---
* Removed modules with no direct replacement: tika-batch (TIKA-4333),
tika-dl (TIKA-4499), the advanced media module (TIKA-4500), tika-fuzzing
(TIKA-4506), tika-age-recogniser (TIKA-4343), tika-server-eval
(TIKA-4555), the dotnet bindings (TIKA-4332) and snaps deployment
(TIKA-4502).
* Removed parsers and classes with no direct replacement:
SentimentAnalysisParser (TIKA-4574); ObjectRecognitionParser and the
Tensorflow recognisers/captioners; PooledTimeSeriesParser;
org.apache.tika.parser.pdf.AccessChecker (replaced by
PDFParserConfig.AccessCheckMode); and the jempbox-based JempboxExtractor /
XMPMetadataExtractor / pdf.xmpschemas.* classes superseded by the unified
XMP extractor (TIKA-4775).
* Smaller removals: ExceptionUtils.trimMessage moved from tika-core to
tika-eval-core; HttpClientFactory's inert redirect-host allowlist
accessors (get/setAllowedHostsForRedirect) are gone (TIKA-4809); and
org.apache.tika.utils.{RereadableInputStream,AnnotationUtils},
org.apache.tika.io.{IOUtils,InputStreamFactory},
org.apache.tika.sax.DIFContentHandler,
org.apache.tika.parser.{AutoDetectParserFactory,ParserFactory} and
org.apache.tika.parser.internal.Activator are removed.
NEW FEATURES
* tika-pipes gains three parse modes: NO_PARSE (detect only, no parse),
CONTENT_ONLY (emitters write raw content, no metadata envelope) and
UNPACK (write embedded bytes out). All three are wired through tika-app
and tika-server (TIKA-4631, TIKA-4637, TIKA-4656).
* New tika-pipes plugins: an Elasticsearch emitter (TIKA-4672), an
Atlassian JWT fetcher (TIKA-4604), Google Drive, Microsoft Graph, Azure
Blob, JSON and HTTP plugins, and an Apache Ignite ConfigStore for
runtime fetcher/emitter configuration (TIKA-4583, TIKA-4587, TIKA-4598).
* New inference and OCR modules: tika-inference and tika-vlm add
vision-language-model parsers (Claude, Gemini, OpenAI) that emit
vlm:prompt-tokens / vlm:completion-tokens, and
tika-parser-tess4j-module adds in-process Tesseract OCR
(TIKA-4665, TIKA-4666, TIKA-4667, TIKA-4690).
* Unified XMP extraction across containers; adds HEIF/HEIC and WebP XMP,
including Samsung/Google Motion Photo (TIKA-4775).
* tika-app and tika-server can load extra jars (additional EncodingDetectors,
Parsers, etc.) from the directory named by the -Dtika.extras.dir system
property, without repackaging the application. Off by default; the
directory is a trusted code location whose contents run with full process
privileges. The jars are forwarded onto forked pipes/server workers too,
so they are available where parsing happens (TIKA-4755).
* A Markdown parser with structured, lossless XHTML output, complementing
the Markdown content handler (TIKA-4770).
* Content-based detection of ASN.1/DER crypto containers, enabled by
default: the PKCS#7/CMS, PKCS#12 and RFC 5544 timestamped-data families
gained magic where 3.x had globs only, and Pkcs7Parser refines the
smime-type on the output Content-Type at parse time. Files that detected
as application/octet-stream in 3.x may now detect as a crypto type; see
configuration/detectors.adoc for the opt-in detect-time refinement
(TIKA-1997, TIKA-2856).
* New detection: Android binary XML (application/vnd.android.axml,
TIKA-4747) and Frictionless Data packages (TIKA-4643); improved mp3/aac
(TIKA-4612) and grib (TIKA-4655) detection.
OTHER CHANGES
* Dependency upgrades since 4.0.0-beta-1, including Jetty 12.1.12, CXF
4.2.3 and SolrJ 10.0.0 (TIKA-4327).
* Release artifacts are now channel-specific. Maven Central gets slim
per-module jars (plus pom, sources and javadoc); the Apache dist area
gets runnable zip distributions (tika-app, tika-server-standard,
tika-eval-app) and drop-in pf4j plugin zips; Docker Hub gets ready-to-run
images. Fat/shaded artifacts no longer go to Maven Central (TIKA-4733).
* The charset, junk-text and language detection stack was rewritten:
language-aware charset detection, a universal junk detector, wider
Unicode handling, the new CharSoup language detector, and more efficient
common-token lookups via bloom filters (TIKA-4662, TIKA-4671, TIKA-4675,
TIKA-4691, TIKA-4719, TIKA-4731, TIKA-4745, TIKA-4754, TIKA-4810).
* Pipes now carries small documents to the forked worker inside the request
instead of writing them to disk first. Content at or below the new
pipes.maxInlineBytes (default 10 MB) rides in the request and is served in
the worker by the reserved __bytes fetcher, touching no disk; larger
content is written out once as before, and a stream already backed by a
file keeps its file. Set maxInlineBytes to 0 to spool every non-empty body
(TIKA-4808).
* PipesClient/PipesServer IPC now enforces a configurable payload limit
(pipes.maxIpcPayloadBytes, default 100 MB) in both directions. Results
that exceed the limit return PAYLOAD_LIMIT_EXCEEDED instead of causing
heap exhaustion; crash messages are also size-capped (TIKA-4793).
* tika-server requests now carry only their own parse-context entries to the
forked worker, which supplies the config defaults itself. Previously the
server sent its config's parse-context with every request, so the worker
treated the operator's timeout-limits as caller input and clamped them at
pipes.maxTotalTaskTimeoutMillis (TIKA-4808).
* tika-grpc now routes fetchAndParse through the PipesParser client pool
instead of one shared single-threaded PipesClient: concurrent calls no
longer crash the worker, pipes.numClients and (for the first time)
pipes.useSharedServer take effect, and pool saturation surfaces in-band as
CLIENT_UNAVAILABLE_WITHIN_MS. An interrupted call recycles its worker, so a
pooled client cannot go back to the queue dirty (TIKA-4815).
fetchAndParseServerSideStreaming now completes the call after delivering
its reply, instead of leaving the client waiting forever (TIKA-4804).
* New audio/video metadata: audio:bitrate, audio:is-variable-bitrate,
audio:has-drm, audio:channels, video:frame-rate, video:bitrate and MP4
sample size; ID3 TCOP and Vorbis COPYRIGHT map to xmpDM:copyright, EXIF
GPS altitude maps to geo:alt, and the presentation start of delayed
QuickTime timed-metadata tracks is exposed (TIKA-4777, TIKA-4779,
TIKA-4780, TIKA-4781, TIKA-4800, TIKA-4802).
* Parsing and robustness fixes across formats: CHM (TIKA-4783), ID3 UTF-16
(TIKA-4784), MPEG2/2.5 Layer III frame sizing (TIKA-4791), .doc empty
comments (TIKA-4718), OOXML hyphenation and field-code hyperlinks
(TIKA-4646, TIKA-4683), RTF attachments in HTML decapsulation
(TIKA-4710), image extraction (TIKA-4736), embedded-file extension
calculation (TIKA-4808), and general media-file robustness (TIKA-4812).
MAPI properties no longer overwrite better-fitting Dublin Core terms
(TIKA-4806). Embedded-file naming was streamlined (TIKA-4689).
* PDFs whose %PDF- header is preceded by a print-composition job ticket are
no longer detected as text/x-matlab: up to 50 %% comment or blank lines may
now precede it, extending the TIKA-3328 rule past its 512-byte reach
(TIKA-4782).
* MagicDetector now compiles its regular expression once, in the
constructor, instead of recompiling it on every match (TIKA-4796).
* tika-eval-core is no longer published as a fat jar (TIKA-4414) and
tika-grpc no longer shades gRPC (TIKA-4709).
* Fix concurrency bug in TikaToXMP (TIKA-4393).
Release 4.0.0-beta-1 - 6/29/2026
Prerelease. Its changes are folded into the 4.0.0 section above.
Release 4.0.0-alpha-1 - 5/4/2026
Prerelease. Its changes are folded into the 4.0.0 section above.
Release 3.3.0 - 3/18/2026
* Switch to poi-ooxml-full (TIKA-4563).
* Users need to add "allowAbsolutePaths=true" for the FileSystemFetcher to fetch
an absolute path (TIKA-4649).
* Add a markdown option for content handlers (TIKA-4563).
* Improve zip parsing (TIKA-4650).
* Add detection of compressed bmp (TIKA-4511).
* Allow per file timeouts in tika-pipes (TIKA-4497).
* Add matroska detector (TIKA-1180).
* Allow multiple values for many Dublin Core keys (TIKA-4466).
* Extract macros by default in tika-app's commandline and gui (TIKA-4472).
* Improve extraction of Javascript from PDFs (TIKA-4465).
Release 3.2.3 - 9/11/2025
* Allow backwards compatibility with versions of commons-compress before 1.28.0 (TIKA-4469).
* Fix XFA parsing within PDFs when woodstox is on the classpath as in tika-server (TIKA-4482).
* Dependency updates.
Release 3.2.2 - 8/6/2025
* Fix for CVE-2025-54988.
* Improve detection of encrypted ODT files (TIKA-4459).
* Dependency updates (TIKA-4455).
Release 3.2.1 - 6/26/2025
* Fix POIFSContainerDetector regression when wrapping an InputStream in
a TikaInputStream (TIKA-4441).
* Important bug fix for zip-based detection on a non-TikaInputStream (TIKA-4424).
* Improve text extraction from EMF (TIKA-4432).
* Dependency updates (TIKA-4421).
Release 3.2.0 - 05/21/2025
* Detect inline images in MSG files (TIKA-4391).
* Improve extraction of metadata in MSG files (TIKA-4381).
* Fix concurrency bug in TikaToXMP (TIKA-4393).
* Fix potential GDAL deadlock (TIKA-4385).
* Improve extraction of properties from msg files (TIKA-4381).
* Include internal attachment path in tika-eval reports (TIKA-4374).
* Upgrade jsoup to 1.20.1 with workaround for change in self-closing tag behavior (TIKA-4419).
* Upgrade dependencies (TIKA-4379).
Release 3.1.0 - 01/28/25
* Allow users to turn off the injection of some headers into the content stream of MSG
files (TIKA-4345).
* Add a wrapper for Google's magika detector (TIKA-4344).
* Add support for MachO via Alexey Pelykh (TIKA-4309).
* Add logic to inject spaces in XPS files based on font widths via Ruairidh Williamson (TIKA-4315).
* Mime type "application/json" is now a sub class of "text/javascript" not "application/javascript" (TIKA-4336)
* Remove tagsoup from the project entirely. Note that
some of the tags produced by the SourceCodeParser are slightly different (TIKA-4338)
Release 3.0.0 - 10/15/2024
* Fix regression in TextAndCSVParser (TIKA-4278).
Release 3.0.0-BETA2 - 07/09/2024
BREAKING CHANGES
* Updated PST parser to use standard Message metadata keys and improved
handling of embedded files (TIKA-4248).
* Convenience methods for XML readers were moved from ParseContext to
XMLReaderUtils (TIKA-4259).
Other Changes
* Add GRPC server (TIKA-4181).
* Improved configurability in tika-pipes (TIKA-4243).
* Add optional PST parser based on libpst/readpst (TIKA-4250).
Release 3.0.0-BETA - 12/01/2023
BREAKING CHANGES
* Require Java 11 (TIKA-4128).
* The boilerpipe handler has been moved to the tika-handler-boiler-pipe
package (TIKA-4138).
* We've migrated HTML parsing to the JSoup parser instead of TagSoup. If
you have a custom configuration on the HTMLParser, you'll need to change
that to o.a.t.p.html.JSoupParser (TIKA-1599).
* Removed xerces2 as a dependency (TIKA-4135).
* tika-core now has a scope of "provided" in most non-app modules (TIKA-4191).
* Tika will look for "custom-mimetypes.xml" directly on the classpath, NOT
under "/org/apache/tika/mime/". (TIKA-4147).
* Return media type "text/javascript" instead of "application/javascript"
to follow RFC-9239. (TIKA-4119).
Other Changes/Updates
* Improve detection of sqlite3-based file formats (TIKA-4187).
* Upgrade PDFBox to 3.0.1 (TIKA-3347)
* Deprecated AbstractParser for removal in 4.x (TIKA-4132).
* Fix bug in DateUtils that stripped timezone information from
incoming Calendar objects (TIKA-4126).
* The InputStreamDigester now calculates stream length (TIKA-4016).
Release 2.9.0 - 8/23/2023
* With user configuration, the PDFParser can now throw an EncryptedDocumentException
for Microsoft IRM PDF containers with encrypted payloads. Separately,
the PDFParser now throws an EncryptedDocumentException instead of an IOException
if the security handler cannot be found (TIKA-4082).
* Fix bug that led to duplicate extraction of macros from some OLE2 containers (TIKA-4116).
* Parse iframe's srcdoc as an embedded file (TIKA-3109).
* Add detection of warc.gz as a specialization of gz and parse as if a standard WARC (TIKA-4048).
* Allow users to modify the attachment limit size in the /unpack resource (TIKA-4039)
* Fixed write limit bug in RecursiveParserWrapper (TIKA-4055).
* Add mime detection for many files with thanks to Gregory Lepore (TIKA-3992).
* Fixed iWork 13 keynote detection on files with wrong extension (TIKA-4111).
Release 2.8.0 - 5/11/2023
* Enable counting and/or parsing of incremental updates in PDFs. This
is an experimental feature and may change in later releases (TIKA-4017).
* Fixed bug that prevented the the loading of CompositeExternalParser in tika-app and
tika-server-standard. This parser will call exiftool and ffmpeg if those are installed, as was
the behavior in Tika 1.x. Exclude org.apache.tika.parser.external.CompositeExternalParser
if you do not want this behavior (TIKA-4022).
* Removed the shading of tika-parsers-standard-module (TIKA-4038).
* Enable optional extraction of file system metadata in FileSystemFetcher (TIKA-4035).
* Allow pretty printing in FileSystemEmitter (TIKA-4034).
* Add detection for and a new mime type for older postscript-based
Adobe Illustrator "application/illustrator+ps" files (TIKA-3971).
* Add magic detection for canon raw file types: crw, cr2 and cr3 (TIKA-3991).
* Add detection for ONIX message files (TIKA-4011).
* Add detection and a parser for ActiveMime files (TIKA-3987).
* Add extraction of rendition layout value and version from Epub (TIKA-4013).
* Improve embedded file extraction from PDFs (TIKA-4012).
* Improve metadata extraction from WARCs (TIKA-4018).
* Update to PDFBox 2.0.28 (TIKA-4016).
* Users may now avoid the ZeroByteFileException via a
setting on the AutoDetectParserConfig (TIKA-3976).
* Fix bug in closing <a> elements in the presence of <b> elements
in RTF files (TIKA-3972).
* Improve extraction of embedded file names in .docx (TIKA-3968).
* Normalize author, title, subject and description to their Dublin Core
properties in the HTMLParser (TIKA-3963).
Release 2.7.0 - 1/31/2023
* Add SVG detection for svg files that lack the xml header (TIKA-3308).
* Migrate to a live fork of Universal Charset Detector (TIKA-3213).
* Improve handling of text-based attachments inside .eml files (TIKA-3959).
* Add tika-parser-nlp-package to release artifacts (TIKA-3958).
* Remove need for <params/> element in classes that extend ConfigBase (TIKA-3946).
* Add X-TIKA:embedded_id_path to ensure unique embedded file paths (TIKA-3942).
* Fix bug that prevented digests when the fallback/EmptyParser
was called (TIKA-3939).
* Remove log4j 1.2.x (and slf4j-log4j12 which now redirects to slf4j-reload4j) from
all modules (TIKA-3935).
* Upgrade mime4j to 0.8.9 (TIKA-3950).
* Refactor date parsing for emails (TIKA-3957)
* Upgrade to Bouncy Castle 1.71 and jdk18on jars (TIKA-3933).
* Add a JDBCPipesReporter (TIKA-3931).
* Add multivalued field strategy option in jdbc-emitter (TIKA-3930).
Default is now 'concatenate' with ', ' as the delimiter.
* Downgrade logging in PipesClient for each parse from info to debug.
Release 2.6.0 - 11/3/2022
* Add optional Siegfried detector (TIKA-3901).
* Move OverrideDetector's functionality to the CompositeDetector (TIKA-3904).
* The FileCommandDetector has been refactored to have the same
behavior as the Siegfried detector; see setUseMime in the javadoc (TIKA-3902).
* Fix bug in OpenSearch emitter that prevented upserts on
documents with embedded files (TIKA-3882).
* Extract PDF actions and triggers into the file's metadata (TIKA-3887).
* Add a tika-async-cli module (TIKA-3885).
* Fetch keys sent via headers to tika server are now URL decoded (TIKA-3864).
Release 2.5.0 - 09/30/2022
* Improved extraction of PDF subset info for PDF/UA, PDF/VT, and PDF/X.
NOTE: we no longer append PDF/A information, e.g. 'version="A-1b"'
to the 'dc:format'. Users must now get that information from the
'pdfa:PDFVersion' key or from 'pdfaid:conformance'
and 'pdfaid:part' (TIKA-3844).
* Avoid infinite loop in bookmark extraction from PDFs (TIKA-3832).
* Upgraded to slf4j 2.0.1 (TIKA-3842).
* Added upsert option for the OpenSearch emitter (TIKA-3855).
* Extract PDF signature information at the document level
into the metadata (TIKA-3852).
* Enable configuration of digests via AutoDetectParserConfig (TIKA-3853).
* Use commons-io byte array streams via PJ Fanning (TIKA-3843).
* Upgrade to PDFBox 2.0.27 (TIKA-3866).
* Upgrade to JempBox 1.8.17 (TIKA-3856).
* Add extraction of ODF version from ODF files (TIKA-3840).
* tika-parser-html-commons (BoilerPipeHandler) is no longer a
a dependency of tika-parser-html-module. tika-app and tika-server-standard
have added a dependency on tika-parser-html-commons. However,
users who are managing custom dependencies and who want the BoilerPipeHandler
will have to now include the tika-parser-html-commons dependency
(TIKA-1484).
* Add unrar as an optional parser (TIKA-3800).
* Refactor FuzzingCLI to use PipesParser (TIKA-3799).
* ServiceLoader's loadServiceProviders() now guarantees
unique classes (TIKA-3797).
* Fix bug that prevented setting of includeHeadersAndFooters
for xls, xlsx, doc and docx via tika-config (TIKA-3796).
* Fix bug that prevented specification of rendered image type
via http header in the PDFParser (TIKA-3794).
* Fix bug causing some Exif dates to be decoded wrongly on
timezones different than UTC (TIKA-3815).
* Numerous dependency upgrades (TIKA-3795).
* Add ALPHA-level initial releases of JDBCEmitter,
FileSystemStatusReporter and OpenSearchPipesReporter.
These may have breaking changes in subsequent releases.
Release 2.4.1 - 06/14/2022
* Implement bulk upload in the OpenSearch emitter (TIKA-3791).
* Implement tika-server client via pipes mode (TIKA-3790).
* Custom embedded parsers and EmbeddedDocumentHandlers
can now add metadata to the container file's
metadata (TIKA-3789).
* Record embedded file exceptions in the container
file's metadata (TIKA-3788).
* Allow continuation of parsing after write limit has
been reached (TIKA-3787).
* Allow pass-through of 'Content-Length' header to metadata
in TikaResource (TIKA-3786).
* Add embedded depth to profiles tables in tika-eval (TIKA-3775).
* Add stop() method to TikaServerCli so that it can be run
with Apache Commons Daemon (TIKA-1570).
* Fixed bug in ordering of Parsers during service loading (TIKA-3750).
* Users can expand system properties from the forking
process into forked tika-server processes (TIKA-3748).
* Fix a few files being wrongly detected as EML (TIKA-3771).
* Fix ignoreCharsets param of Icu4jEncodingDetector (TIKA-3774).
Release 2.4.0 - 04/23/2022
* NOTE: To save on resources, we no longer include the
deeplearning4j dependencies in the tika-dl jar. The dependencies for the
tika-dl package must be provided by users. See:
https://github.com/apache/tika/blob/main/tika-parsers/tika-parsers-ml/tika-dl/pom.xml
for the dependencies that must be provided at run-time (TIKA-3676).
* NOTE: Added prefix "dwg-custom:" to DWG custom metadata properties (TIKA-3731).
* Add initial, BETA-grade TLS encryption option for tika-server;
configuration may change in future releases (TIKA-3719).
* Allow specification of fetcherName and fetchKey via query parameters
in request URI in tika-server (TIKA-3714).
* Add basic parsers for WARC and WACZ in tika-parsers-standard (TIKA-3697).