引入:

因为项目需求,我们要用到openCMS。虽然以前用过很多类似的内容管理系统类似Vignette,Fatwire,但是openCMS虽然大体功能差不多,具体并没用过,所以这里做了一些研究,会陆续把这些研究心得分享出来。这里先从openCMS安装讲起,虽然简单,但也有一些值得探讨的问题。


安装亮点1:不可以重复配置openCMS。

我们知道,第一次运行openCMS需要做配置,配置的请求URL是:http://localhost:8080/opencms/setup/ ,但是运行第一次之后就不可以运行第二次了,理由是在安装过程中,它会去调用CmsSetupBean类的prepareSetup10()方法:

/**
     * Prepares step 10 of the setup wizard.

     */    publicvoidprepareStep10() {           if (isInitialized()) {             // lock the wizard for further use              lockWizard();             // save Properties to file "opencms.properties"              saveProperties(getProperties(),CmsSystemInfo.FILE_PROPERTIES, false);               setSchemaGeneration(false);             m_peristenceConfigurator.save();         }     }

而这个方法会去调用lockWizard()方法后保存opencms.properties让其生效,lockWizard方法的实现就是把opencms.properties中key为wizard.enabled设为false:

publicvoidlockWizard() {
 
        setExtProperty("wizard.enabled", CmsStringUtil.FALSE);
}

这会导致我们的opencms.properties被更改:

#
# Enable/Disable OpenCms Setup Wizard
# The wizard sets the flag to false after the setup.
# To use the wizard again, reset it manually to true.
# By setting no value, wizard can always be used.
#################################################################################
wizard.enabled=false

而下次运行时候,它会去判断此属性,判断点在CmsAutoSetup类的main()方法中调用的run()方法的第一行:

/**
     * Performs the setup.

     * @throws Exception       */    publicvoidrun() throwsException {           if (m_bean.getWizardEnabled()) {               longtimeStarted = System.currentTimeMillis();               CmsSetupTests setupTests = new CmsSetupTests();            …         } }



安装亮点2: 正确设置max_allowed_packet这个mysql系统变量的大小。

在opencms安装过程中,它会对一些DB变量做检查,其代码如下:

/**
     * Returns an optional warning message ifneeded, null if not.

     *       * @param db the selected database key      *       * @return html warning, or null if no warning      */    publicString checkVariables(String db) {           StringBuffer html = new StringBuffer(512);         if (m_con == null){             return null; // prior error,trying to get a connection         }         Exception exception = null;         if (db.equals("mysql")){             String statement = "SELECT @@max_allowed_packet;";             Statement stmt = null;             ResultSet rs = null;             longmaxAllowedPacket = 0;             try {                 stmt = m_con.createStatement();                 rs = stmt.executeQuery(statement);                 if (rs.next()) {                     maxAllowedPacket = rs.getLong(1);                 }             } catch (Exception e) {                 exception = e;             } finally {                 if (stmt != null){                     try {                         stmt.close();                     } catch (SQLException e) {                         // ignore                     }                 }             }             if (exception == null){                 intmegabyte = 1024 * 1024;                 if (maxAllowedPacket > 0) {                     html.append("

MySQL system variable 'max_allowed_packet'is set to ");                     html.append(maxAllowedPacket);                     html.append(" Byte (");                     html.append((maxAllowedPacket / megabyte) + "MB).

\n");                 }                 html.append("

Please note that it will not be possible for OpenCms tohandle files bigger than this value in the VFS.

\n");                 intrequiredMaxAllowdPacket = 16;                 if (maxAllowedPacket < (requiredMaxAllowdPacket * megabyte)){                     m_errors.add("

Your 'max_allowed_packet'variable is set to less than "                         + (requiredMaxAllowdPacket* megabyte)                         + " Byte("                         + requiredMaxAllowdPacket                         + "MB).

\n"                         + "

The required value for running OpenCms isat least "                         + requiredMaxAllowdPacket                         + "MB."                         + "Please change your MySQL configuration (in themy.ini or my.cnffile).

\n");                 }             } else {                 html.append("

OpenCms was not able to detect the value of your'max_allowed_packet'variable.

\n");                 html.append("

Please note that it will not be possible for OpenCms tohandle files bigger than this value.

\n");                 html.append("

The recommended value for running OpenCms is 16MB,please set it in your MySQL configuration (in yourmy.ini or my.cnffile).

\n");                 html.append(CmsException.getStackTraceAsString(exception));             }         }         if (html.length() == 0) {             return null;         }         return html.toString();     }

从这里可以看出,对于数据库是mysql的情形,它会先去执行数据库查询读取max_allowed_packet的值,这个变量主要让mysql限制服务器接受的单个数据包的大小(因为在openCMS中,经常要存富文本内容,所以这个值还是要设置大点为好),并且如果它<16MB, 则报错our max_allowed_packet variable is set to less than 16MB。而默认的mysql这个值配置是4MB,所以第一次setup出错。我们在my.ini中将其改为30MB,这样才过了这关:

opencms 安装细节探讨_第1张图片



安装亮点3:opencms中资产的存储。

opencms中,这些资产都是以BLOB形式存储的:

opencms 安装细节探讨_第2张图片