diff --git a/.github/workflows/ci-all.yaml b/.github/workflows/ci-all.yaml
index b0ddbad3495a..53978ed31d1b 100644
--- a/.github/workflows/ci-all.yaml
+++ b/.github/workflows/ci-all.yaml
@@ -98,6 +98,14 @@ jobs:
- name: Checkout
uses: actions/checkout@v7
+ - name: Setup Java
+ if: ${{ inputs.phing_task_phpunit }}
+ uses: actions/setup-java@v6
+ with:
+ # Solr 10 requires Java 21 or later.
+ distribution: temurin
+ java-version: '21'
+
- name: Configure Apache for PHP ${{ matrix.php-version }}
if: ${{ inputs.phing_task_phpunit }}
run: |
diff --git a/.gitignore b/.gitignore
index 4a567fee1e2e..c26c327fd5a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,8 @@
/downloads
/Gruntfile.local.js
/solr/vendor
+# Generated at startup by solr.sh (see solr.sh for details)
+/solr/vufind/biblio/lib/
/themes/minktest
/vendor
ChangeLog
diff --git a/build.xml b/build.xml
index cfa67390022b..e80d1140dd8e 100644
--- a/build.xml
+++ b/build.xml
@@ -52,7 +52,7 @@
-
+
@@ -62,7 +62,7 @@
-
+
diff --git a/import-marc.sh b/import-marc.sh
index 554273bcc047..dd1612a170a4 100755
--- a/import-marc.sh
+++ b/import-marc.sh
@@ -172,6 +172,10 @@ if [ $REGENERATE_SOLRJ_DIR -eq 1 ]
then
for file in $VUFIND_HOME/solr/vendor/server/solr-webapp/webapp/WEB-INF/lib/solr*.jar $VUFIND_HOME/solr/vendor/server/solr-webapp/webapp/WEB-INF/lib/http*.jar
do
+ # Newer Solr versions (10 and later) no longer ship http*.jar files in the
+ # webapp, so an unmatched glob pattern would be passed through literally by
+ # the shell; only link files that actually exist.
+ [ -e "$file" ] || continue
ln -s $file $SOLRJ_DIR/`basename "$file"`
done
fi
diff --git a/import/browse-indexing.jar b/import/browse-indexing.jar
index e4158b9406c9..6a2743d0be7d 100644
Binary files a/import/browse-indexing.jar and b/import/browse-indexing.jar differ
diff --git a/import/solrmarc_core_3.5.jar b/import/solrmarc_core_3.5.jar
index b6bf536bdf49..fe301d779573 100644
Binary files a/import/solrmarc_core_3.5.jar and b/import/solrmarc_core_3.5.jar differ
diff --git a/solr.sh b/solr.sh
index 61da67955471..4aafc2021e1c 100755
--- a/solr.sh
+++ b/solr.sh
@@ -97,4 +97,33 @@ then
fi
export SOLR_LOGS_DIR=$SOLR_LOGS_DIR
-"$SOLR_BIN/solr" "$1" ${SOLR_ADDITIONAL_START_OPTIONS} --port "$SOLR_PORT" --solr-home "$SOLR_HOME" -m "$SOLR_HEAP" --user-managed --jvm-opts "-Ddisable.configEdit=true -Dsolr.log=$SOLR_LOGS_DIR -Dsolr.config.lib.enabled=true $SOLR_ADDITIONAL_JVM_OPTIONS"
+
+# The biblio core needs several jars on its classpath. Solr 10 no longer
+# supports entries in solrconfig.xml, and the core lib/ directory only
+# picks up jar files directly inside it (not subdirectories). We therefore
+# (re)generate the lib/ symlinks on every start, from:
+# - the stable jars checked into the VuFind repo, and
+# - the "analysis-extras" module (e.g. ICU4J for the browse normalizers).
+# Every symlink in lib/ is regenerated, so the directory is a pure runtime
+# artifact (git-ignored) and self-heals across Solr upgrades.
+BIBLIO_LIB="$SOLR_HOME/biblio/lib"
+mkdir -p "$BIBLIO_LIB"
+for link in "$BIBLIO_LIB"/*
+do
+ [ -L "$link" ] && rm -f "$link"
+done
+for jar in "$SOLR_HOME/jars"/*.jar \
+ "$VUFIND_HOME/import"/solrmarc_core_*.jar \
+ "$VUFIND_HOME/import/lib"/marc4j-*.jar
+do
+ [ -e "$jar" ] && ln -sf "$jar" "$BIBLIO_LIB/"
+done
+if [ -d "$VUFIND_HOME/solr/vendor/modules/analysis-extras/lib" ]
+then
+ for jar in "$VUFIND_HOME/solr/vendor/modules/analysis-extras/lib"/*.jar
+ do
+ ln -sf "$jar" "$BIBLIO_LIB/"
+ done
+fi
+
+"$SOLR_BIN/solr" "$1" ${SOLR_ADDITIONAL_START_OPTIONS} --port "$SOLR_PORT" --solr-home "$SOLR_HOME" -m "$SOLR_HEAP" --user-managed --jvm-opts "-Ddisable.configEdit=true -Dsolr.log=$SOLR_LOGS_DIR $SOLR_ADDITIONAL_JVM_OPTIONS"
diff --git a/solr/vufind/authority/conf/solrconfig.xml b/solr/vufind/authority/conf/solrconfig.xml
index 869a2eeea0b6..87be58bc08d3 100644
--- a/solr/vufind/authority/conf/solrconfig.xml
+++ b/solr/vufind/authority/conf/solrconfig.xml
@@ -32,7 +32,7 @@
that you fully re-index after changing this setting as it can
affect both how text is indexed and queried.
-->
- 9.11
+ 10.3.2
diff --git a/solr/vufind/biblio/conf/solrconfig.xml b/solr/vufind/biblio/conf/solrconfig.xml
index 7cb971ba81d2..d1eca6400506 100644
--- a/solr/vufind/biblio/conf/solrconfig.xml
+++ b/solr/vufind/biblio/conf/solrconfig.xml
@@ -32,7 +32,7 @@
that you fully re-index after changing this setting as it can
affect both how text is indexed and queried.
-->
- 9.11
+ 10.3.2
@@ -42,11 +42,6 @@
If replication is in use, this should match the replication configuration. -->
${solr.solr.home:./solr}/biblio
-
-
-
-
-
false
diff --git a/solr/vufind/jars/browse-handler.jar b/solr/vufind/jars/browse-handler.jar
index 9748577147cd..dad7db3b13f8 100644
Binary files a/solr/vufind/jars/browse-handler.jar and b/solr/vufind/jars/browse-handler.jar differ
diff --git a/solr/vufind/reserves/conf/solrconfig.xml b/solr/vufind/reserves/conf/solrconfig.xml
index 125edaee91e1..d3ee476a0577 100644
--- a/solr/vufind/reserves/conf/solrconfig.xml
+++ b/solr/vufind/reserves/conf/solrconfig.xml
@@ -32,7 +32,7 @@
that you fully re-index after changing this setting as it can
affect both how text is indexed and queried.
-->
- 9.11
+ 10.3.2
diff --git a/solr/vufind/solr.xml b/solr/vufind/solr.xml
index e247452da4d6..6102393a7c55 100644
--- a/solr/vufind/solr.xml
+++ b/solr/vufind/solr.xml
@@ -32,13 +32,8 @@
${host:}
${jetty.port:8983}
- ${hostContext:solr}
-
- ${genericCoreNodeNames:true}
${zkClientTimeout:30000}
- ${distribUpdateSoTimeout:600000}
- ${distribUpdateConnTimeout:60000}
diff --git a/solr/vufind/website/conf/solrconfig.xml b/solr/vufind/website/conf/solrconfig.xml
index 67252bfae6ad..3ee484735efb 100644
--- a/solr/vufind/website/conf/solrconfig.xml
+++ b/solr/vufind/website/conf/solrconfig.xml
@@ -32,7 +32,7 @@
that you fully re-index after changing this setting as it can
affect both how text is indexed and queried.
-->
- 9.11
+ 10.3.2