Alfresco 2.0 解讀
一、介紹
Alfresco
is the Open Source Alternative for Enterprise Content Management (ECM),
providing Document Management, Collaboration, Records Management,
Knowledge Management, Web Content Management and Imaging.
采用的技術(shù)
Java
Spring Aspect-Oriented Framework
ACEGI – Aspect-Oriented Security Framework
MyFaces JSF Implementation
Hibernate ORM Persistence
Lucene Text Search Engine
JLAN
POI File Format Conversion
PDFBox – PDF Conversion
OpenOffice
jBPM
Rhino JavaScript engine
支持的接口
CIFS/SMB Microsoft File Share Protocol
JSR-168 Portlet Specification
JSR-127 Java Server Faces
FTP
WebDAV
Web Services
REST
二、配置解讀
1、從web.xml開(kāi)始入手
其它的略過(guò),在 web.xml 中可以看到加載了如下 Spring 配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:alfresco/web-client-application-context.xml
classpath:web-services-application-context.xml
classpath:alfresco/web-api-application-context.xml
classpath:alfresco/application-context.xml
</param-value>
<description>Spring config file locations</description>
</context-param>
web client 層
alfresco/web-client-application-context.xml
打開(kāi)它可以看到它引入了所有的 alfresco/web-client*.xml & alfresco/extension/web-client*.xml & jar:*!/META-INF/web-client*.xml
web api 層
alfresco/web-api-application-context.xml
打開(kāi)它可以看到它引入了 alfresco/web-api-config.xml & alfresco/extension/web-api-config-custom.xml
web service 層
web-services-application-context.xml
剛開(kāi)始找這個(gè)文件時(shí),居然沒(méi)有找到,怪事!not exist???why?
于是后來(lái)才發(fā)現這個(gè)文件是在 remote-api.jar 包里,暈,不是很好的做法啊。
bean 配置定義關(guān)鍵的文件
alfresco/application-context.xml
<import resource="classpath:alfresco/core-services-context.xml"/>
<import resource="classpath:alfresco/public-services-context.xml"/>
<import resource="classpath:alfresco/model-specific-services-context.xml"/>
<import resource="classpath:alfresco/action-services-context.xml"/>
<import resource="classpath:alfresco/rule-services-context.xml"/>
<import resource="classpath:alfresco/node-services-context.xml"/>
<import resource="classpath:alfresco/scheduled-jobs-context.xml"/>
<import resource="classpath:alfresco/network-protocol-context.xml"/>
<import resource="classpath:alfresco/content-services-context.xml"/>
<import resource="classpath:alfresco/hibernate-context.xml"/>
<import resource="classpath:alfresco/ownable-services-context.xml"/>
<import resource="classpath:alfresco/template-services-context.xml"/>
<import resource="classpath:alfresco/script-services-context.xml"/>
<import resource="classpath:alfresco/index-recovery-context.xml"/>
<import resource="classpath:alfresco/authority-services-context.xml"/>
<import resource="classpath:alfresco/authentication-services-context.xml"/>
<import resource="classpath:alfresco/policy-context.xml"/>
<import resource="classpath:alfresco/import-export-context.xml"/>
<import resource="classpath:alfresco/bootstrap-context.xml"/>
<import resource="classpath:alfresco/workflow-context.xml"/>
<import resource="classpath:alfresco/jcr-api-context.xml"/>
<import resource="classpath:alfresco/avm-services-context.xml"/>
<import resource="classpath:alfresco/audit-services-context.xml"/>
<import resource="classpath*:alfresco/patch/*-context.xml"/>
<import resource="classpath*:alfresco/domain/*-context.xml"/>
<!--
Import all modules and related components.
Extensions are explicitly imported after this so that the default
mechanism can still be used to override module-specific beans.
-->
<import resource="classpath*:alfresco/module-context.xml"/>
<!--
Import of general extensions and bean overrides.
To give developers final control over the tuning
of their own local build, the dev-context.xml file
is processed last (note: dev-context.xml isn‘t
part of the source tree itself).
For details, see:
http://wiki.alfresco.com/wiki/Developer_Runtime_Configuration
-->
<import resource="classpath*:alfresco/extension/*-context.xml"/>
<import resource="classpath*:alfresco/extension/dev-context.xml"/>
可以看到分層次地進(jìn)行加載不同的 bean ,并且在后面提供可擴展的 bean 定義的引入,方便進(jìn)行擴展,而不需要更變這個(gè)配置文件
繼續一個(gè)個(gè)往下看,并把一些重要的 bean 配置拿出來(lái):
core-services-context.xml 核心 bean 的配置
看到配置了 JMX 的服務(wù)
<!-- Custom MBeanServer -->
<bean id="alfrescoMBeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
<property name="port" value="${avm.remote.port}"/>
</bean>
<!-- MBeanServer Connector (registers itself with custom alfrescoMBeanServer) -->
<bean id="serverConnector"
class="org.springframework.jmx.support.ConnectorServerFactoryBean"
depends-on="registry">
<property name="server" ref="alfrescoMBeanServer"/>
<property name="objectName" value="connector:name=rmi"/>
<property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:${avm.remote.port}/alfresco/jmxrmi"/>
<property name="environment">
<map>
<!-- The following keys are only valid when sun jmx is used -->
<entry key="jmx.remote.x.password.file" value="${alfresco.jmx.dir}/alfresco-jmxrmi.password"/>
<entry key="jmx.remote.x.access.file" value="${alfresco.jmx.dir}/alfresco-jmxrmi.access"/>
</map>
</property>
</bean>
<!-- MBeans registered with alfrescoMBeanServer -->
<bean id="VirtServerRegistry"
class="org.alfresco.mbeans.VirtServerRegistry"
init-method="initialize">
JMX 服務(wù)暴露
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="server" ref="alfrescoMBeanServer"/>
<property name="beans">
<map>
<!-- MBeans to register with alfrescoMBeanServer -->
<entry key="Alfresco:Name=VirtServerRegistry,Type=VirtServerRegistry" value-ref="VirtServerRegistry"/>
<entry key="Alfresco:Name=FileServerConfig,Type=FileServerConfig" value-ref="FileServerConfig"/>
</map>
</property>
</bean>
同時(shí)暴露了 RMI 的服務(wù)
RMI
<!-- The RMI export of the repo remote transport. -->
<bean id="repoRemoteTransportRMI" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service">
<ref bean="repoRemoteTransport"/>
</property>
<property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.RepoRemoteTransport</value>
</property>
<property name="serviceName">
<value>repo</value>
</property>
<property name="registryPort">
<value>${avm.remote.port}</value>
</property>
</bean>
驗證 bean 配置,也是同時(shí)暴露了 RMI 的服務(wù)
authentication-services-context.xml
<!-- Here for now. Probably want remote-context.xml file. -->
<!-- The AuthenticationService exported as an RMI service. -->
<bean id="rmiAuthenticationService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service">
<ref bean="AuthenticationService"/>
</property>
<property name="serviceInterface">
<value>org.alfresco.service.cmr.security.AuthenticationService</value>
</property>
<property name="serviceName">
<value>authentication</value>
</property>
<property name="registryPort">
<value>${avm.remote.port}</value>
</property>
</bean>
avm 里也暴露了 RMI 的服務(wù)
avm-services-context.xml
<!-- The RMI wrapper around the AVM remote interface. -->
<bean id="avmRemoteService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service">
<ref bean="avmRemoteTransport"/>
</property>
<property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value>
</property>
<property name="serviceName">
<value>avm</value>
</property>
<property name="registryPort">
<value>${avm.remote.port}</value>
</property>
</bean>
<bean id="avmSyncServiceTransport" class="org.alfresco.repo.avm.AVMSyncServiceTransportImpl">
<property name="authenticationService">
<ref bean="AuthenticationService"/>
</property>
<property name="avmSyncService">
<ref bean="AVMSyncService"/>
</property>
</bean>
<bean id="avmSyncServiceTransportRMI" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service">
<ref bean="avmSyncServiceTransport"/>
</property>
<property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value>
</property>
<property name="serviceName">
<value>avmsync</value>
</property>
<property name="registryPort">
<value>${avm.remote.port}</value>
</property>
</bean>
通過(guò)上面的 JMX 與 RMI 暴露在不同的配置文件里可以看到,如果我要去掉 JMX 或 RMI 服務(wù)的話(huà),需要修改 N 個(gè)的配置文件,實(shí)在是麻煩。
建議要二次開(kāi)發(fā)時(shí)根據需要進(jìn)行整理,合并到一個(gè)文件里進(jìn)行暴露即可,或者沒(méi)有需要的話(huà)就直接 delete 掉這些:)
而且這個(gè) JMX RMI 服務(wù)的暴露,導致你不能僅重啟應用就可以,而非得重啟整個(gè)應用服務(wù)器才行,要不然會(huì )報服務(wù)已啟動(dòng),即默認的端口50500被占用了,而整個(gè)應用啟動(dòng)不了,麻煩。除非你在重啟應用之前再去修改一下配置文件里的端口號,呵呵。
不過(guò),最終的解決辦法是象我在 Jmx4Log4J 里那樣自己去再封裝一個(gè)獲取端口號的類(lèi),發(fā)現有人用了,就找下一個(gè):)這樣就OK了。
core-services-context.xml
<!-- Datasource bean -->
數據庫連接池用的居然是 org.apache.commons.dbcp.BasicDataSource ,大家自己改吧 c3p0 等等
郵件
<!-- MAIL SERVICE -->
<bean id="mailService" class="org.springframework.mail.javamail.JavaMailSenderImpl">
Lucene 索引和搜索 API
<!-- Indexing and Search API -->
<bean id="indexerComponent" class="org.alfresco.repo.search.IndexerComponent">
<bean id="searchService" class="org.alfresco.repo.search.SearcherComponent">
<!-- Indexer and searchers for lucene -->
<bean id="luceneIndexerAndSearcherFactory"
class="org.alfresco.repo.search.impl.lucene.LuceneIndexerAndSearcherFactory2">
<!-- Indexer and searchers for lucene -->
<bean id="luceneCategoryService" class="org.alfresco.repo.search.impl.lucene.LuceneCategoryServiceImpl">
鎖
<!-- Lock Service -->
<bean id="lockService" class="org.alfresco.repo.lock.LockServiceImpl" init-method="initialise">
版本控制
<!-- Version Service -->
<bean id="versionService" class="org.alfresco.repo.version.VersionServiceImpl" init-method="initialise">
數據庫
<!-- Data Dictionary -->
<bean id="dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="resourceBundles">
<property name="models">
<list>
<!-- System models -->
<value>alfresco/model/dictionaryModel.xml</value>
<value>alfresco/model/systemModel.xml</value>
<value>org/alfresco/repo/security/authentication/userModel.xml</value>
<!-- Content models -->
<value>alfresco/model/contentModel.xml</value>
<value>alfresco/model/bpmModel.xml</value>
<value>alfresco/model/wcmModel.xml</value>
<value>alfresco/model/forumModel.xml</value>
<!-- Content models -->
<value>alfresco/model/applicationModel.xml</value>
<value>alfresco/model/wcmAppModel.xml</value>
<!-- Implementation models -->
<value>org/alfresco/repo/action/actionModel.xml</value>
<value>org/alfresco/repo/rule/ruleModel.xml</value>
<value>org/alfresco/repo/version/version_model.xml</value>
<!-- Deprecated types -->
<value>alfresco/model/deprecated/deprecated_contentModel.xml</value>
</list>
</property>
<property name="labels">
<list>
<value>alfresco/model/dataTypeAnalyzers</value>
<value>alfresco/messages/system-model</value>
<value>alfresco/messages/dictionary-model</value>
<value>alfresco/messages/content-model</value>
<value>alfresco/messages/bpm-messages</value>
<value>alfresco/messages/application-model</value>
<value>alfresco/messages/forum-model</value>
</list>
</property>
</bean>
拷貝
<!-- Copy Service -->
<!-- Note this uses the node service that enforces permissions so you can only copy what you can see -->
<bean id="copyService" class="org.alfresco.repo.copy.CopyServiceImpl" init-method="init">
檢出 / 檢入
<!-- CheckOut/CheckIn Service -->
<bean id="checkOutCheckInService" class="org.alfresco.repo.coci.CheckOutCheckInServiceImpl">
全文搜索
<!-- Bean to support full text search -->
<bean id="LuceneFullTextSearchIndexer"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
Lucene 索引文件備份
<!-- Bean to backup Lucene indexes -->
<bean id="luceneIndexBackupComponent"
class="org.alfresco.repo.search.impl.lucene.LuceneIndexerAndSearcherFactory2$LuceneIndexBackupComponent">
<!-- Registry service -->
<bean id="registryService" class="org.alfresco.repo.admin.registry.RegistryServiceImpl" init-method="init">
<!-- A Simple Filesystem like API for the repo implementation.
Unfinished, experimental, and probably ephemeral. -->
<bean id="repoRemoteService" class="org.alfresco.repo.remote.RepoRemoteService">
<!-- Transactionally wrapped version of above. -->
<bean id="RepoRemoteService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
public-services-context.xml
當中引入了
<import resource="classpath:alfresco/public-services-security-context.xml"/>
public-services-security-context.xml 安全認證相關(guān)
使用的是 Acegi 組件,當中引入了
<import resource="classpath:alfresco/cache-context.xml" />
cache-context.xml Cache 相關(guān)的,使用的是 EHCache
<bean name="transactionalEHCacheManager" class="org.alfresco.repo.cache.EhCacheManagerFactoryBean">
<property name="configLocation">
<value>classpath:alfresco/ehcache-transactional.xml</value>
</property>
</bean>
public-services-context.xml
<!-- Service Registry -->
<bean id="ServiceRegistry" class="org.alfresco.repo.service.ServiceDescriptorRegistry"/>
基本上服務(wù)都從這里注入并從中獲取,樹(shù)結構,當中有Spring Bean Factory
model-specific-services-context.xml
<!-- File/folder specific service -->
<bean name="fileFolderService" class="org.alfresco.repo.model.filefolder.FileFolderServiceImpl" init-method="init">
<bean name="tempFileMarkerInterceptor" class="org.alfresco.repo.model.filefolder.TempFileMarkerInterceptor">
<!-- Multilingual specific service -->
<bean name="multilingualContentService" class="org.alfresco.repo.model.ml.MultilingualContentServiceImpl">
action-services-context.xml Action 相關(guān)的
用 Thread local containing the current action chain
<!-- Action Service -->
<bean id="actionService" class="org.alfresco.repo.action.ActionServiceImpl">
rule-services-context.xml 規則、觸發(fā)規則服務(wù)
<!-- Rules Service -->
<bean id="ruleService" class="org.alfresco.repo.rule.RuleServiceImpl">
<!-- Rules Aspect -->
<bean id="rulesAspect" class="org.alfresco.repo.rule.RulesAspect" init-method="init">
<!-- Rule triggers -->
<bean id="rule-trigger-base" abstract="true" init-method="registerRuleTrigger">
node-services-context.xml 節點(diǎn)相關(guān)服務(wù)
<!-- Beans pertinent to node persistence and services -->
scheduled-jobs-context.xml 定時(shí)任務(wù)
<!-- Task scheduler -->
<!-- Triggers should not appear here - the scheduler should be injected into the trigger definition -->
<!-- This bean should not need to apear else where in extension configuration -->
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="waitForJobsToCompleteOnShutdown">
<value>true</value>
</property>
<property name="configLocation">
<value>classpath:alfresco/domain/quartz.properties</value>
</property>
<property name="schedulerName">
<value>DefaultScheduler</value>
</property>
</bean>
# Quartz thread settings 默認的線(xiàn)程優(yōu)先級為 3
org.quartz.threadPool.threadPriority=3
network-protocol-context.xml 網(wǎng)絡(luò )相關(guān)的服務(wù)
需要相關(guān)的文件配置信息在 file-servers.xml 中
content-services-context.xml 內容相關(guān)的服務(wù)
MIME OpenOffice PDF Mail MP3 ...
hibernate-context.xml Hibernate 的映射配置文件
<!-- load hibernate configuration properties -->
<bean id="hibernateConfigProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:alfresco/domain/hibernate-cfg.properties</value>
</list>
</property>
</bean>
<!-- load hibernate entity cache strategies -->
<bean id="cacheStrategiesPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders">
<value>true</value>
</property>
<property name="locations">
<list>
<value>classpath:alfresco/domain/cache-strategies.properties</value>
</list>
</property>
</bean>
<!-- Hibernate session factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" parent="sessionFactoryBase">
<!-- Hibernate session factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" parent="sessionFactoryBase">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="sessionFactoryBase" abstract="true">
<property name="hibernateProperties" ref="hibernateConfigProperties"/>
不同的Cache策略
<property name="entityCacheStrategies">
<property name="collectionCacheStrategies">
ownable-services-context.xml
Ownership service support. Use in permissions framework as dynamic authority.
<bean id="ownableService" class="org.alfresco.repo.ownable.impl.OwnableServiceImpl">
template-services-context.xml 模板引擎 freemarker
script-services-context.xml 腳本引擎 Rhino JavaScript engine.
index-recovery-context.xml 索引校驗與恢復
<!-- index recovery and validation -->
<!--
Recovery types are:
NONE: Ignore
VALIDATE: Checks that the last transaction for each store is represented in the indexes
AUTO: Validates and auto-recovers if validation fails
FULL: Full index rebuild, processing all transactions in order. The server is temporarily suspended.
-->
<bean
id="indexRecoveryComponent"
class="org.alfresco.repo.node.index.FullIndexRecoveryComponent"
parent="indexRecoveryComponentBase">
<property name="recoveryMode">
<value>${index.recovery.mode}</value>
</property>
</bean>
<!-- Bean that attempts to index content that was previously missing -->
<bean
id="missingContentReindexComponent"
class="org.alfresco.repo.node.index.MissingContentReindexComponent"
parent="indexRecoveryComponentBase">
</bean>
authority-services-context.xml 授權服務(wù)
<!-- The configuration of the Authority Service Implementation -->
<!-- This implementation supports the identification of users as admin users. -->
<!-- It also supports groups and allows groups and users to be arranged into -->
<!-- hierarchies. -->
<bean id="authorityService" class="org.alfresco.repo.security.authority.AuthorityServiceImpl">
<!-- A list of users with admin rights. -->
<!-- -->
<!-- If the security framework is case sensitive these values should -->
<!-- be case sensitive user names. If the security framework is not -->
<!-- case sensitive these values should be the lower-case user names. -->
<!-- -->
<!-- By default this includes: -->
<!-- admin (the user name of default alfresco admin user) -->
<!-- administrator (the windows default admin user) -->
<!-- -->
<!-- This assumes that user names are not case sensitive. -->
<!-- -->
<property name="adminUsers">
<set>
<value>admin</value>
<value>administrator</value>
</set>
</property>
<!-- Authority DAO that stores group information along with user information, -->
<!-- in the repository. -->
<!-- -->
<!-- This bean uses the userToAuthorityCache configured in cache-context.xml -->
<!-- -->
<bean id="authorityDAO" class="org.alfresco.repo.security.authority.AuthorityDAOImpl">
authentication-services-context.xml 驗證 Acegi
<!-- This file contains the bean definitions that support authentication -->
policy-context.xml 策略服務(wù)
<!-- Policy Support -->
import-export-context.xml 導入導出服務(wù)
bootstrap-context.xml 系統啟動(dòng)的初始化工作
如:數據庫、AVM、文件服務(wù)器、FTP、NFS、CIFS等等。。。
Repository Bootstrap Sequence.
<!-- ensure that the schema is bootstrapped -->
<bean id="schemaBootstrap" class="org.alfresco.repo.domain.schema.SchemaBootstrap">
<property name="localSessionFactory">
<ref bean="&sessionFactory"></ref> <!-- inject the actual factory, not a session -->
</property>
workflow-context.xml 工作流相關(guān)的服務(wù),JBPM
<!-- Workflow Service Implementation -->
jcr-api-context.xml 實(shí)現JCR 170相關(guān)的API,即1.0版本的API
Alfresco implementation of a JCR Repository
avm-services-context.xml AVM相關(guān)服務(wù),以及一堆的DAO
<!-- ID Issuers. -->
<!-- DAOs for persistent data types -->
<!-- Issuers are not actual entities. More like pseudo entities. -->
avm-console-context.xml
<!-- Use substitution values in this config. -->
avm-console.properties 默認配置為本地MySQL的數據庫
# Database specifics.
db.driver=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://127.0.0.1/avm
db.username=root
db.password=
db.pool.initial=4
db.pool.max=32
# Hibernate properties
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.current_session_context_class=thread
hibernate.connection.isolation=2
hibernate.default_batch_fetch_size=16
hibernate.jdbc.batch_versioned_data=true
hibernate.cache.use_second_level_cache=true
hibernate.hbm2ddl.auto=update
# AVM specific properties.
<import resource="file:config/alfresco/avm-base-context.xml"/>
audit-services-context.xml
<!-- Base audit service - non TX -->
<bean id="auditService" class="org.alfresco.repo.audit.AuditServiceImpl">
<property name="auditComponent">
<ref bean="auditComponent"/>
</property>
</bean>
<!-- Audit component -->
<bean id="auditComponent" class="org.alfresco.repo.audit.AuditComponentImpl">
其后在 application-context.xml 還加載了
<import resource="classpath*:alfresco/patch/*-context.xml"/>一堆Patch,呵呵
patch-services-context.xml
<import resource="classpath*:alfresco/domain/*-context.xml"/>其它的。。。
<import resource="classpath*:alfresco/module-context.xml"/>
module-context.xml 加載其它的模塊Bean
最后加載一些擴展與二次開(kāi)發(fā)的Bean
<import resource="classpath*:alfresco/extension/*-context.xml"/>
<import resource="classpath*:alfresco/extension/dev-context.xml"/>
同時(shí)覆蓋掉想覆蓋的Bean,后面覆蓋前面的,Map嘛。比如: custom-repository-context.xml 里的屬性配置、資源配置、事務(wù)配置等
三、配置安裝時(shí)的注意事項
1、要將 Alfresco 默認安裝使用的數據庫HSQL轉換為MqSQL的話(huà),只需要刪掉三個(gè) HSQL 使用的文件:
這三個(gè)文件分別是 tomcat/shared/classes/alfresco/extension 目錄下的
custom-db-and-data-context.xml
custom-db-connection.properties
custom-hibernate-dialect.properties
為了產(chǎn)生一個(gè)MySQL數據庫,執行 <alfresco_installation_folder>\extra\database\mysql ,運行 db_setup.bat 文件,或者打開(kāi)文件,手工輸入命令也一樣。
就會(huì )產(chǎn)生一個(gè)與一個(gè)使用者一起命名 alfresco 的 MySQL 數據庫帳戶(hù)和一個(gè) alfresco 的密碼。
2、國際化
alfresco的文件路徑為: WEB-INF\classes\alfresco\messages 下面包含了一堆文件,一個(gè)個(gè)去國際化吧,當然用插件、Native2ASCII或配合ANT都可以。
Eclipse 的 PropertiesEditor 插件不錯。
3、無(wú)論從一種數據庫切換到另一種數據庫,都要記得把 repository.properties 配置文件里 dir.root 所在的目錄下的文件刪除干凈,要不然會(huì )出問(wèn)題。
比如:Caused by: org.alfresco.repo.search.SearcherException: More than one root node in index: 2
#dir.root=./alf_data
4、將 Win32NetBIOS.dll 拷貝到 %JAVA_HOME%\jre\bin\ 目錄下 或者 %TOMCAT_HOME%\bin 目錄下
5、不要 ScriptService 的話(huà),可以在 public-services-context.xml 中
注釋掉 ScriptService 和 ScriptService_transaction
<!-- Script Service -->
<!--
<bean id="ScriptService" class="org.springframework.aop.framework.ProxyFactoryBean">
...
<bean id="ScriptService_transaction" class="org.springframework.transaction.interceptor.TransactionInterceptor">
...
-->
6、查看 Hibernate 的 SQL
修改 log4j.properties
在 log4j.logger.org.hibernate 下增加一行,即可
log4j.logger.org.hibernate.SQL=debug
7、
發(fā)現啟動(dòng)報 "Ensure that the ‘dir.root‘ property is pointing to the correct
data location." ... 之類(lèi)的錯誤時(shí)可以在 repository.properties 配置文件里將 strict 設置為
false
# Change the failure behaviour of the configuration checker
system.bootstrap.config_check.strict=false
不過(guò),設置后很有可能可以啟動(dòng),但是仍是登錄不了之類(lèi)的,要小心。
如果用的是HSQL的話(huà),最好把 alf_data\hsql_data 下面的 alfresco.properties 和 alfresco.script 恢復成原來(lái)的,并刪除其它的文件,再重啟就可以了。
8、
第 7 條,仍報錯 ERROR [repo.admin.ConfigurationChecker] CONTENT INTEGRITY
ERROR: Indexes not found for 5 stores. 的話(huà),設置為全部索引,并按第 3
條所說(shuō)的刪除文件,或者直接就換個(gè)文件夾,不要用默認的文件夾名稱(chēng),并刪除數據庫的內容(所有的表以及HIBERNATE_SEQUENCE),并重啟即
可。
在 repository.properties 中設置
index.recovery.mode=FULL
9、如果是強行關(guān)閉掉Tomcat之類(lèi)后,馬上啟動(dòng)Tomcat的話(huà),有可能會(huì )報錯
IOException
while loading persisted sessions: java.io.WriteAbortedException:
writing aborted; java.io.NotSerializableException:
org.alfresco.web.ui.common.component.UIListItem
過(guò)一會(huì )兒再啟動(dòng)就沒(méi)有問(wèn)題了。
10、Alfresco 2.0 需要 JDK 1.5_07 以上的版本,這個(gè)也要注意。
11、用戶(hù)名大小字問(wèn)題,可以在 repository.properties 進(jìn)行設置
# Are user names case sensitive?
user.name.caseSensitive=true
設置為 true ,大小寫(xiě)敏感,默認為 false
12、關(guān)閉FTP服務(wù),在 bootstrap-context.xml 配置中注釋掉它就可以了。file-servers.xml里保存相關(guān)的配置信息
<!-- FTP Server -->
<!--
<bean id="ftpServer" class="org.alfresco.filesys.FTPServer" destroy-method="stopServer">
<constructor-arg>
<ref local="fileServerConfiguration"/>
</constructor-arg>
</bean>
-->
或者也可以在 file-servers.xml 文件中設置 <serverEnable enabled="false"/>
13、關(guān)閉CIFS服務(wù)
在 file-servers.xml 文件中設置 <serverEnable enabled="false"/> 即可。
四、數據庫模型
可以看附件,有包含JBPM的與不包含JBMP的兩個(gè)數據庫
五、相關(guān)資料
Java Content Repository API 簡(jiǎn)介 學(xué)習 JSR-170 如何使構建 CMA 變得輕而易舉
國外廠(chǎng)商紛紛投入開(kāi)源界 自述其中原因,此文重點(diǎn)介紹 Alfresco 的相關(guān)信息。
六、開(kāi)發(fā)與代碼分析
1、換 Web Services 的實(shí)現方式由 AXIS 換到 XFire
Codehaus XFire is a next-generation java SOAP framework. Codehaus
XFire makes service oriented development approachable through its easy
to use API and support for standards. It is also highly performant
since it is built on a low memory StAX based model.
==============================================================
代碼分析有時(shí)間再繼續整理上來(lái)
Category由id,title,description組成
public Category(org.alfresco.webservice.types.Reference id,java.lang.String title,java.lang.String description)
Classification
public Classification(java.lang.String
classification,org.alfresco.webservice.types.Category
rootCategory,java.lang.String title,java.lang.String description)
Reference
public Reference(org.alfresco.webservice.types.Store store,java.lang.String uuid,java.lang.String path)
AppliedCategory?
public AppliedCategory(java.lang.String classification,org.alfresco.webservice.types.Reference[] categories)
ClassDefinition
public ClassDefinition(java.lang.String name,java.lang.String
title,java.lang.String description,java.lang.String superClass,boolean
isAspect,org.alfresco.webservice.types.PropertyDefinition[]
properties,org.alfresco.webservice.types.AssociationDefinition[]
associations)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1609437