Alfresco 2.0 解读

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Alfresco 2.0 解读   一、介绍 http://www.alfresco.com Alfresco is the Open Source Alternative for Enterprise Content Management (ECM), providing Document Management, Collaboration, Records Management
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.
 
采用的技术
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开始入手
其它的略过,在 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
打开它可以看到它引入了所有的 alfresco/web-client*.xml & alfresco/extension/web-client*.xml & jar:*!/META-INF/web-client*.xml
web api 层
alfresco/web-api-application-context.xml
打开它可以看到它引入了 alfresco/web-api-config.xml & alfresco/extension/web-api-config-custom.xml
web service 层
web-services-application-context.xml
刚开始找这个文件时,居然没有找到,怪事!not exist???why?
于是后来才发现这个文件是在 remote-api.jar 包里,晕,不是很好的做法啊。
bean 配置定义关键的文件
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 " />
 
可以看到分层次地进行加载不同的 bean ,并且在后面提供可扩展的 bean 定义的引入,方便进行扩展,而不需要更变这个配置文件
 
继续一个个往下看,并把一些重要的 bean 配置拿出来:
core-services-context.xml 核心 bean 的配置
看到配置了 JMX 的服务
<!-- 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 服务暴露
< 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 >
 
同时暴露了 RMI 的服务
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 配置,也是同时暴露了 RMI 的服务
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 的服务
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 >
 
通过上面的 JMX 与 RMI 暴露在不同的配置文件里可以看到,如果我要去掉 JMX 或 RMI 服务的话,需要修改 N 个的配置文件,实在是麻烦。
建议要二次开发时根据需要进行整理,合并到一个文件里进行暴露即可,或者没有需要的话就直接 delete 掉这些:)
 
而且这个 JMX RMI 服务的暴露,导致你不能仅重启应用就可以,而非得重启整个应用服务器才行,要不然会报服务已启动,即默认的端口50500被占用了,而整个应用启动不了,麻烦。除非你在重启应用之前再去修改一下配置文件里的端口号,呵呵。
 
不过,最终的解决办法是象我在 Jmx4Log4J 里那样自己去再封装一个获取端口号的类,发现有人用了,就找下一个:)这样就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 安全认证相关
使用的是 Acegi 组件,当中引入了
    <import resource="classpath:alfresco/cache-context.xml" />
 
cache-context.xml Cache 相关的,使用的是 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 " />
 
基本上服务都从这里注入并从中获取,树结构,当中有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 相关的
用 Thread local containing the current action chain
    <!-- Action Service -->
    < bean id =" actionService " class =" org.alfresco.repo.action.ActionServiceImpl ">
rule-services-context.xml 规则、触发规则服务
<!-- 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 节点相关服务
<!-- Beans pertinent to node persistence and services -->
scheduled-jobs-context.xml 定时任务
<!-- 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 默认的线程优先级为 3
org.quartz.threadPool.threadPriority=3
network-protocol-context.xml 网络相关的服务
需要相关的文件配置信息在 file-servers.xml
content-services-context.xml 内容相关的服务
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 授权服务
<!-- 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 策略服务
<!-- Policy Support -->
import-export-context.xml 导入导出服务
bootstrap-context.xml 系统启动的初始化工作
如:数据库、AVM、文件服务器、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 =" &amp;sessionFactory "></ ref >   <!-- inject the actual factory, not a session -->
  </ property >
workflow-context.xml 工作流相关的服务,JBPM
<!-- Workflow Service Implementation -->
 
jcr-api-context.xml 实现JCR 170相关的API,即1.0版本的API
Alfresco implementation of a JCR Repository
avm-services-context.xml AVM相关服务,以及一堆的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
最后加载一些扩展与二次开发的Bean
< import resource =" classpath*:alfresco/extension/*-context.xml "/>
< import resource =" classpath*:alfresco/extension/dev-context.xml " />
 
同时覆盖掉想覆盖的Bean,后面覆盖前面的,Map嘛。比如: custom-repository-context.xml 里的属性配置、资源配置、事务配置等

三、配置安装时的注意事项
1、要将 Alfresco 默认安装使用的数据库HSQL转换为MqSQL的话,只需要删掉三个 HSQL 使用的文件:
这三个文件分别是 tomcat/shared/classes/alfresco/extension 目录下的
            custom-db-and-data-context.xml
            custom-db-connection.properties
            custom-hibernate-dialect.properties
为了产生一个MySQL数据库,执行 <alfresco_installation_folder>/extra/database/mysql ,运行 db_setup.bat 文件,或者打开文件,手工输入命令也一样。
就会产生一个与一个使用者一起命名 alfresco 的 MySQL 数据库帐户和一个 alfresco 的密码。
 
2、国际化
alfresco的文件路径为: WEB-INF/classes/alfresco/messages 下面包含了一堆文件,一个个去国际化吧,当然用插件、Native2ASCII或配合ANT都可以。
Eclipse 的 PropertiesEditor 插件不错。
 
3、无论从一种数据库切换到另一种数据库,都要记得把 repository.properties 配置文件里 dir.root 所在的目录下的文件删除干净,要不然会出问题。
比如: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 的话,可以在 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、发现启动报 "Ensure that the 'dir.root' property is pointing to the correct data location." ... 之类的错误时可以在 repository.properties 配置文件里将 strict 设置为 false
# Change the failure behaviour of the configuration checker
system.bootstrap.config_check.strict=false
不过,设置后很有可能可以启动,但是仍是登录不了之类的,要小心。
如果用的是HSQL的话,最好把 alf_data/hsql_data 下面的 alfresco.propertiesalfresco.script 恢复成原来的,并删除其它的文件,再重启就可以了。
 
8、第 7 条,仍报错 ERROR [repo.admin.ConfigurationChecker] CONTENT INTEGRITY ERROR: Indexes not found for 5 stores. 的话,设置为全部索引,并按第 3 条所说的删除文件,或者直接就换个文件夹,不要用默认的文件夹名称,并删除数据库的内容(所有的表以及HIBERNATE_SEQUENCE),并重启即可。
在 repository.properties 中设置
index.recovery.mode=FULL
 
9、如果是强行关闭掉Tomcat之类后,马上启动Tomcat的话,有可能会报错
IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.alfresco.web.ui.common.component.UIListItem
过一会儿再启动就没有问题了。
 
10、Alfresco 2.0 需要 JDK 1.5_07 以上的版本,这个也要注意。
 
11、用户名大小字问题,可以在 repository.properties 进行设置
# Are user names case sensitive?
user.name.caseSensitive=true
设置为 true ,大小写敏感,默认为 false
 
12、关闭FTP服务,在 bootstrap-context.xml 配置中注释掉它就可以了。file-servers.xml里保存相关的配置信息
<!-- 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、关闭CIFS服务
在 file-servers.xml 文件中设置 <serverEnable enabled="false"/> 即可。
四、数据库模型
可以看附件,有包含JBPM的与不包含JBMP的两个数据库
五、相关资料
Java Content Repository API 简介 学习 JSR-170 如何使构建 CMA 变得轻而易举
 
国外厂商纷纷投入开源界 自述其中原因,此文重点介绍 Alfresco 的相关信息。
六、开发与代码分析
1、换 Web Services 的实现方式由 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.
 
==============================================================
代码分析有时间再继续整理上来
 
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)
 

 附件下载:

1、Alfresco Database Model

2、Alfresco2.0

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
Linux 网络安全
树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
|
前端开发 API 决策智能
多智能体微调实践:α-UMi 开源
近年来,为了加强大型语言模型(Large-Language Models, LLM)实时信息处理、解决专业问题的能力,催生了工具调用智能体(Tool Integrated Agent)概念
|
数据采集 测试技术
Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案
本文讨论了在使用Selenium和WebDriver自动化测试时常见的执行格式错误(Errno 8 Exec format error)问题。错误通常发生在运行ChromeDriver时,与兼容性或路径配置有关。文章提供了多种解决方案,包括手动更改路径、更新或重新安装webdriver-manager包、下载特定版本的ChromeDriver、修改driver_cache.py文件。此外,还介绍了如何结合代理IP技术使用Selenium进行网页抓取,以提高效率和成功率。示例代码展示了如何配置代理IP并使用Selenium访问网站。通过这些方法,用户可以有效解决执行格式错误,并提高网页自动化测试
1341 1
Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案
|
Python
新手向 Python:VsCode环境下Manim配置
该文介绍了如何准备和配置开发环境以使用Manim,主要包括两个步骤:一是准备工作,需要下载并安装VsCode和Anaconda,其中Anaconda需添加到系统PATH环境变量,并通过清华镜像源配置;二是配置环境,VsCode中安装中文插件和Python扩展,激活并配置虚拟环境。最后,安装ffmpeg和manim,通过VsCode运行测试代码验证配置成功。
1515 1
|
移动开发 前端开发 JavaScript
除了 `<Link>` 标签和 `<a>` 标签,还有哪些标签可以用于实现链接?
除了 `&lt;Link&gt;` 和 `&lt;a&gt;` 标签,还可以使用 `&lt;area&gt;`(图像映射中的链接)、`&lt;button&gt;`(按钮点击跳转)和 `&lt;form&gt;`(表单提交跳转)等标签实现链接功能。
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT提示技巧——“让我们思考一下”提示
ChatGPT提示技巧——“让我们思考一下”提示
174 4
|
安全 Android开发 iOS开发
安卓系统与iOS系统的比较####
【10月更文挑战第26天】 本文将深入探讨安卓(Android)和iOS这两大主流移动操作系统的各自特点、优势与不足。通过对比分析,帮助读者更好地理解两者在用户体验、应用生态、系统安全等方面的差异,从而为消费者在选择智能手机时提供参考依据。无论你是技术爱好者还是普通用户,这篇文章都将为你揭示两大系统背后的故事和技术细节。 ####
530 0
|
Cloud Native 安全 自动驾驶
全新升级!《云原生架构白皮书 2022 版》重磅发布
今年,《云原生架构白皮书2022版》正式上线,相较于2020年版本,本次内容新增数十家企业实战经验合集,同时在云原生产品矩阵中,新增多个核心产品家族,如容器产品家族、微服务产品家族、云原生技术中台 CNStack 产品家族等,更加一站式助力企业数字化转型。
9360 1
全新升级!《云原生架构白皮书 2022 版》重磅发布