Building Alfresco 6 CE from Sources (I)

von Lutz Horn
Kategorien: alfresco
cover-image
<p>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 (<a href="https://github.com/ecm4u/alfresco-ce-repository/tree/5.2.g-patched"><code>alfresco-ce-repository</code></a>, <a href="https://github.com/ecm4u/alfresco-data-model/tree/6.16-patched"><code>alfresco-data-model</code></a>, <a href="https://github.com/ecm4u/share/tree/5.2.f-patched"><code>share</code></a>). Um diese Projekte zu bauen, musste man nicht mehr als <code>mvn install</code> ausführen.</p> <p>Nicht mehr länger.</p> <h2>Building Alfresco 6 - Welche Module sind erforderlich?</h2> <p>Alfresco 6, auch bekannt als <a href="https://community.alfresco.com/docs/DOC-8102-alfresco-community-edition-201901-ga-release-notes">Alfresco 201901 GA CE</a>, 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 <a href="https://github.com/Alfresco/acs-community-deployment/releases/tag/2.2.0"><code>acs-community-deployment</code></a>. OK, clonen wir dies.</p> <pre><code>$ git clone https://github.com/Alfresco/acs-community-deployment.git $ git checkout tags/2.2.0</code></pre> <p>Aber wo sind die Sourcen? Dies ist noch nicht einmal ein Maven-Projekt!</p> <p>Es gibt auf GitHub noch viele andere Projekte, eines davon ist <a href="https://github.com/Alfresco/acs-community-packaging">acs-community-packaging</a>. Werfen wir einen Blick darauf.</p> <pre><code>$ git clone https://github.com/Alfresco/acs-community-packaging.git $ git checkout tags/acs-community-packaging-6.1.2-ga</code></pre> <p>Das sieht besser aus. Hier gibt es eine <code>pom.xml</code>, die uns etwas über die Versionen der anderen Projekte verrät, die zu diesem Release gehören.</p> <pre><code class="language-xml">&lt;dependency.alfresco-core.version&gt;7.5&lt;/dependency.alfresco-core.version&gt; &lt;dependency.alfresco-data-model.version&gt;8.25&lt;/dependency.alfresco-data-model.version&gt; &lt;dependency.alfresco-repository.version&gt;7.43&lt;/dependency.alfresco-repository.version&gt; &lt;dependency.alfresco-remote-api.version&gt;7.35&lt;/dependency.alfresco-remote-api.version&gt; &lt;dependency.alfresco-hb-data-sender.version&gt;1.0.9&lt;/dependency.alfresco-hb-data-sender.version&gt; &lt;dependency.alfresco-spring-webscripts.version&gt;6.20&lt;/dependency.alfresco-spring-webscripts.version&gt; &lt;dependency.alfresco-mmt.version&gt;6.0&lt;/dependency.alfresco-mmt.version&gt; &lt;dependency.alfresco-pdf-renderer.version&gt;1.1&lt;/dependency.alfresco-pdf-renderer.version&gt; &lt;dependency.alfresco-trashcan-cleaner.version&gt;2.3&lt;/dependency.alfresco-trashcan-cleaner.version&gt; &lt;dependency.alfresco-jlan.version&gt;7.1&lt;/dependency.alfresco-jlan.version&gt; &lt;dependency.alfresco-server-root.version&gt;6.0.1&lt;/dependency.alfresco-server-root.version&gt; &lt;dependency.alfresco-messaging-repo.version&gt;1.2.9&lt;/dependency.alfresco-messaging-repo.version&gt; &lt;dependency.alfresco-api-explorer.version&gt;6.1.0-RC4&lt;/dependency.alfresco-api-explorer.version&gt;</code></pre> <h2>Building <code>alfresco-core</code></h2> <p>Beginnen wir mit dem ersten Modul <code>alfresco-core</code>.</p> <pre><code>$ git clone https://github.com/Alfresco/alfresco-core.git $ git checkout tags/7.5 $ mvn package ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------</code></pre> <p>Großartig!</p> <h2>Building <code>alfresco-data-model</code></h2> <p>Auf zum nächsten Modul: <code>alfresco-data-model</code>.</p> <pre><code>$ git clone https://github.com/Alfresco/alfresco-data-model.git $ git checkout tags/8.25 $ mvn package ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------</code></pre> <p>Das war einfach.</p> <h2>Building <code>alfresco-repository</code></h2> <p>Dies ist das Haupt-Modul.</p> <pre><code>$ 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.</code></pre> <p>Was? <code>7.43</code> ist die Version aus der <code>pom.xml</code> in <code>acs-community-packaging</code>. Warum gibt es dafür kein Tag?</p> <pre><code>$ git tag | grep 7.43 alfresco-repository-7.43</code></pre> <p>OK, die Tag-Namen stimmen also nicht direkt mit den Versionen überein. Verwirrend. Checken wir das vorhandene Tag aus.</p> <pre><code>$ git checkout tags/alfresco-repository-7.43 $ mvn package</code></pre> <p>Wie erwartet dauert dies eine Weile. Sobald die Unit-Tests ausgeführt werden, kommen jedoch Fehler.</p> <pre><code>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.&lt;clinit&gt;(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.&lt;clinit&gt;(KeyStoreTests.java:68) Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL '' at org.alfresco.encryption.KeyStoreTests.&lt;clinit&gt;(KeyStoreTests.java:68) Caused by: java.sql.SQLException: No suitable driver at org.alfresco.encryption.KeyStoreTests.&lt;clinit&gt;(KeyStoreTests.java:68)</code></pre> <p>Warum sind die Treiberklasse und die Verbindungs-URL leer? Hat uns die <a href="https://github.com/Alfresco/alfresco-repository/blob/alfresco-repository-7.43/README.md"><code>README.md</code></a> nicht gesagt, "<em>The project can be built by running Maven command</em>: <code>mvn clean install</code>"?</p> <p>Aber halt - sie sagt dann aber auch:</p> <p><em>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</em>:</p> <pre><code>mvn clean test -Dtest=SomeRepoTest -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql:alfresco -Ddb.username=alfresco -Ddb.password=alfresco</code></pre> <p>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.</p> <pre><code>$ 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</code></pre> <p>Der erste Unit-Test wird gestartet, es wird jedoch kein Fortschritt erzielt.</p> <pre><code>[INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running org.alfresco.RepositoryStartStopTest</code></pre> <p>Was passiert? Der Unit-Test schreibt in ein Log-File unter</p> <p><code>target/surefire-reports/org.alfresco.RepositoryStartStopTest-output.txt</code>:</p> <pre><code>... 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</code></pre> <p>Warum ist die Datenquelle geschlossen? In PostgreSQL sehen wir 11 Verbindungen über JDBC:</p> <pre><code>lutz@localhost:alfresco-6&gt; 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</code></pre> <p>Das hängt bis wir Maven killen.</p> <p>Content-Objekte wurden erstellt - es sieht also so aus, als wenn das Alfresco Repository gestartet wurde.</p> <pre><code> 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</code></pre> <p>Doch was haben wir übersehen?</p> <h2>Fortsetzung folgt</h2> <p>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. </p> <hr /> <p><small>Picture credits: <cite title="Pexels / Pixabay (Image #1868728)"><a href="https://pixabay.com/photos/concept-man-papers-person-plan-1868728/" target="_blank" class="button" rel="nofollow">rawpixel</a></cite> licenced under the <a href="https://pixabay.com/en/service/license/" target="_blank" class="button" rel="nofollow">pixabay license</a> (free for commercial use)</small></p> <!-- image: Pexels https://pixabay.com/en/hand-business-plan-business-3190204/ -->
<script src="/user/sites/blog.ecm4u.de/plugins/simplesearch/js/simplesearch.js"></script>