Building Alfresco 6 CE from Sources (I)

von Lutz Horn
Kategorien: alfresco
cover-image

Wir bei ecm4u setzen Alfresco CE als Basis bei vielen Kunden-Installationen ein. Manchmal müssen wir Änderungen im Quellcode vornehmen, um Fehler zu beheben oder um Funktionen zu ergänzen. Um dies zu ermöglichen, haben wir bisher die 5.2-Projekte geclont und veröffentlicht (alfresco-ce-repository, alfresco-data-model, share). Um diese Projekte zu bauen, musste man nicht mehr als mvn install ausführen.

Nicht mehr länger.

Building Alfresco 6 - Welche Module sind erforderlich?

Alfresco 6, auch bekannt als Alfresco 201901 GA CE, vom Quellcode zu bauen ist nicht mehr so leicht wie es mit Alfresco 5.2 war. Als erstes müssen wir herausfinden, welche Module zu diesem Release gehören. Die Release Nodes verweisen uns auf acs-community-deployment. OK, clonen wir dies.

$ git clone https://github.com/Alfresco/acs-community-deployment.git
$ git checkout tags/2.2.0

Aber wo sind die Sourcen? Dies ist noch nicht einmal ein Maven-Projekt!

Es gibt auf GitHub noch viele andere Projekte, eines davon ist acs-community-packaging. Werfen wir einen Blick darauf.

$ git clone https://github.com/Alfresco/acs-community-packaging.git
$ git checkout tags/acs-community-packaging-6.1.2-ga

Das sieht besser aus. Hier gibt es eine pom.xml, die uns etwas über die Versionen der anderen Projekte verrät, die zu diesem Release gehören.

<dependency.alfresco-core.version>7.5</dependency.alfresco-core.version>
<dependency.alfresco-data-model.version>8.25</dependency.alfresco-data-model.version>
<dependency.alfresco-repository.version>7.43</dependency.alfresco-repository.version>
<dependency.alfresco-remote-api.version>7.35</dependency.alfresco-remote-api.version>
<dependency.alfresco-hb-data-sender.version>1.0.9</dependency.alfresco-hb-data-sender.version>
<dependency.alfresco-spring-webscripts.version>6.20</dependency.alfresco-spring-webscripts.version>
<dependency.alfresco-mmt.version>6.0</dependency.alfresco-mmt.version>
<dependency.alfresco-pdf-renderer.version>1.1</dependency.alfresco-pdf-renderer.version>
<dependency.alfresco-trashcan-cleaner.version>2.3</dependency.alfresco-trashcan-cleaner.version>
<dependency.alfresco-jlan.version>7.1</dependency.alfresco-jlan.version>
<dependency.alfresco-server-root.version>6.0.1</dependency.alfresco-server-root.version>
<dependency.alfresco-messaging-repo.version>1.2.9</dependency.alfresco-messaging-repo.version>
<dependency.alfresco-api-explorer.version>6.1.0-RC4</dependency.alfresco-api-explorer.version>

Building alfresco-core

Beginnen wir mit dem ersten Modul alfresco-core.

$ git clone https://github.com/Alfresco/alfresco-core.git
$ git checkout tags/7.5
$ mvn package
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Großartig!

Building alfresco-data-model

Auf zum nächsten Modul: alfresco-data-model.

$ git clone https://github.com/Alfresco/alfresco-data-model.git
$ git checkout tags/8.25
$ mvn package
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Das war einfach.

Building alfresco-repository

Dies ist das Haupt-Modul.

$ git clone https://github.com/Alfresco/alfresco-repository.git
$ git checkout tags/7.43
error: pathspec 'tags/7.43' did not match any file(s) known to git.

Was? 7.43 ist die Version aus der pom.xml in acs-community-packaging. Warum gibt es dafür kein Tag?

$ git tag | grep 7.43
alfresco-repository-7.43

OK, die Tag-Namen stimmen also nicht direkt mit den Versionen überein. Verwirrend. Checken wir das vorhandene Tag aus.

$ git checkout tags/alfresco-repository-7.43
$ mvn package

Wie erwartet dauert dies eine Weile. Sobald die Unit-Tests ausgeführt werden, kommen jedoch Fehler.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialect': FactoryBean threw exception on object creation; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL ''
        at org.alfresco.encryption.KeyStoreTests.<clinit>(KeyStoreTests.java:68)
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL ''
        at org.alfresco.encryption.KeyStoreTests.<clinit>(KeyStoreTests.java:68)
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL ''
        at org.alfresco.encryption.KeyStoreTests.<clinit>(KeyStoreTests.java:68)
Caused by: java.sql.SQLException: No suitable driver
        at org.alfresco.encryption.KeyStoreTests.<clinit>(KeyStoreTests.java:68)

Warum sind die Treiberklasse und die Verbindungs-URL leer? Hat uns die README.md nicht gesagt, "The project can be built by running Maven command: mvn clean install"?

Aber halt - sie sagt dann aber auch:

All of these classes as well as individual tests can be run by specifying the test class name and a set of DB connection properties, for example:

mvn clean test -Dtest=SomeRepoTest -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql:alfresco -Ddb.username=alfresco -Ddb.password=alfresco

Nun, diese Verbindungseigenschaften sind nicht optional, sie sind obligatorisch. Bevor wir jedoch eine Verbindung zu einer Datenbank herstellen können, müssen wir eine erstellen. Wir werden eine PostgreSQL-Datenbank für meinen lokalen Linux-Benutzer verwenden.

$ createdb alfresco-6
$ mvn test \
  -Ddb.driver=org.postgresql.Driver \
  -Ddb.name=alfresco-6 \
  -Ddb.url=jdbc:postgresql:alfresco-6 \
  -Ddb.username=lutz \
  -Ddb.password=lutz

Der erste Unit-Test wird gestartet, es wird jedoch kein Fortschritt erzielt.

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.alfresco.RepositoryStartStopTest

Was passiert? Der Unit-Test schreibt in ein Log-File unter

target/surefire-reports/org.alfresco.RepositoryStartStopTest-output.txt:

...
 2019-04-11 12:44:47,369  INFO  [repo.thumbnail.ThumbnailRegistry] [main] Init'ed thumbnail defs in 341 ms
 2019-04-11 12:44:47,480  DEBUG [repo.action.ActionServiceImpl] [main] Retrieving 0 conditions
 2019-04-11 12:44:47,488  DEBUG [repo.action.ActionServiceImpl] [main] Retrieving 0 conditions
 2019-04-11 12:44:47,492  DEBUG [repo.action.ActionServiceImpl] [main] Retrieving 0 conditions
 2019-04-11 12:44:47,495  DEBUG [repo.action.ActionServiceImpl] [main] Retrieving 0 conditions
 2019-04-11 12:44:47,498  DEBUG [repo.action.ActionServiceImpl] [main] Retrieving 0 conditions
 2019-04-11 12:44:47,500  DEBUG [repo.action.ActionServiceImpl] [main] Retrieving 0 conditions
 2019-04-11 12:44:47,505  DEBUG [repo.action.ActionServiceImpl] [main] Retrieving 0 conditions
 2019-04-11 12:44:47,570  INFO  [management.subsystems.ChildApplicationContextFactory] [main] Starting 'Messaging' subsystem, ID: [Messaging, default]
 2019-04-11 12:45:05,658  DEBUG [repo.transaction.RetryingTransactionHelper] [JobLockService1]
Transaction commit failed:
   Thread: JobLockService1
   Txn:    UserTransaction[object=org.alfresco.util.transaction.SpringAwareUserTransaction@429dfd32, status=6]
   Iteration: 0
   Exception follows:
 org.alfresco.util.transaction.ConnectionPoolException: 03110072 The DB connection pool is depleted.
        at org.alfresco.util.transaction.SpringAwareUserTransaction.begin(SpringAwareUserTransaction.java:418)
        at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:439)
        at org.alfresco.repo.lock.JobLockServiceImpl.releaseLockVerify(JobLockServiceImpl.java:477)
        at org.alfresco.repo.lock.JobLockServiceImpl$2.run(JobLockServiceImpl.java:385)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Data source is closed
        at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:305)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474)
        at org.alfresco.util.transaction.SpringAwareUserTransaction.begin(SpringAwareUserTransaction.java:413)
        ... 10 more
Caused by: java.sql.SQLException: Data source is closed
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1362)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
        at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:262)
        ... 13 more

Warum ist die Datenquelle geschlossen? In PostgreSQL sehen wir 11 Verbindungen über JDBC:

lutz@localhost:alfresco-6> select usename, application_name, query from pg_stat_activity where datname = 'alfresco-6';
+-----------+------------------------+--------------------------------------------------------------------------------------------+
| usename   | application_name       | query                                                                                      |
|-----------+------------------------+--------------------------------------------------------------------------------------------|
| lutz      | PostgreSQL JDBC Driver | SET application_name = 'PostgreSQL JDBC Driver'                                            |
| lutz      | PostgreSQL JDBC Driver | SET application_name = 'PostgreSQL JDBC Driver'                                            |
| lutz      | PostgreSQL JDBC Driver | SET application_name = 'PostgreSQL JDBC Driver'                                            |
| lutz      | PostgreSQL JDBC Driver | SET application_name = 'PostgreSQL JDBC Driver'                                            |
| lutz      | PostgreSQL JDBC Driver | COMMIT                                                                                     |
| lutz      | PostgreSQL JDBC Driver | COMMIT                                                                                     |
| lutz      | PostgreSQL JDBC Driver | COMMIT                                                                                     |
| lutz      | PostgreSQL JDBC Driver | COMMIT                                                                                     |
| lutz      | PostgreSQL JDBC Driver | COMMIT                                                                                     |
| lutz      | PostgreSQL JDBC Driver | COMMIT                                                                                     |
| lutz      | PostgreSQL JDBC Driver | SET application_name = 'PostgreSQL JDBC Driver'                                            |
| lutz      | pgcli                  | select usename, application_name, query from pg_stat_activity where datname = 'alfresco-6' |
+-----------+------------------------+--------------------------------------------------------------------------------------------+
SELECT 12

Das hängt bis wir Maven killen.

Content-Objekte wurden erstellt - es sieht also so aus, als wenn das Alfresco Repository gestartet wurde.

 tree target/alf_data/contentstore | head
target/alf_data/contentstore
└── 2019
    └── 4
        └── 11
            └── 12
                └── 44
                    ├── 00e71591-c66b-4413-84b9-80a163533814.bin
                    ├── 04c89936-3f38-41ea-a078-84a570ebe42b.bin
                    ├── 05d2a453-4f52-4e47-9eea-bed8b31a6f4b.bin
                    ├── 0686dc22-ccaf-4e63-8979-9f783e3d9a3e.bin

Doch was haben wir übersehen?

Fortsetzung folgt

Leider sind wir nur bis hierher gekommen, Alfresco 201901 GA CE aus den Quellen zu bauen. Wir werden mit Teil 2 fortfahren, sobald wir Fortschritte gemacht haben.


Picture credits: rawpixel licenced under the pixabay license (free for commercial use)