-
Solo 开发环境搭建详细说明(用 MySQL8 数据库,对 Solo 开发指南的环境搭建的补充)
2019-08-27 07:37这是连接 MySQL 时报的错。
连续执行以下命令 SET GLOBAL binlog_format = 'STATEMENT'; SET GLOBAL binlog_format = 'ROW'; SET GLOBAL binlog_format = 'MIXED';
再试试。
-
Solo 开发环境搭建详细说明(用 MySQL8 数据库,对 Solo 开发指南的环境搭建的补充)
2019-08-27 06:55用下面这个命令即可:
nohup mvn jetty:run &
详情你可以百度 nohup 这个命令。然后就可以做别的事情了。
-
Solo 开发环境搭建详细说明(用 MySQL8 数据库,对 Solo 开发指南的环境搭建的补充)
2019-08-27 06:54不用,只要运行一次 nohup mvn jetty:run & 命令,后台就处于运行状态,那么随时都可以通过浏览器访问博客了。
-
Solo 开发环境搭建详细说明(用 MySQL8 数据库,对 Solo 开发指南的环境搭建的补充)
2019-07-06 23:46不好意思,之前没理解你说“在后台运行”的意思。用下面这个命令即可:
nohup mvn jetty:run &
详情你可以百度 nohup 这个命令。
-
对 solo 发展的一些建议(有想法的请看过来)
2019-07-05 21:13- 发这个贴子是谈一点个人对 solo 发展的想法,为了不引起不同技术爱好者们的互相抬扛所以用了“戏说”的语气,就是为了软化这些分岐,尽量以一种自嘲说笑的方式表达出来(我是个 solo 新人,水平很菜的,请扛精们放过哈)。我的文中也说了“不是说这些技术不好”,也没有拒绝这些技术的意思,只是希望 solo 做为一个产品的发布,能够更纯粹一些。
- 用不用 docker,nginx 可以让用户根据情况来选择即可,solo 对这些软件或技术都是可以支持的,但不是使用 solo 的必要条件。比如想用 docker 的 solo 还必须配个 nginx 的代理,不配 nginx 的代理就不能登录是不是就有点那个(至少没有做到 用 Docker 实现“一个命令开箱即用”嘛,或者为什么不把 nginx 也打包到 docker 里呢?)。当然配 nginx 的代理也是有理由的,我后面也回贴说了理解。
- 要不要 docker,要不要 nginx 代理,要不要选 mysql 或其它数据库,这些都是偏重工程和运维上的问题了,可以把 solo 拉不同的分支版本来支持这些不同的运用场景。solo 的主版本只要最简配置即可。当然我不是说一定要按照这个意思来改嘛,只是提个建议啊。
- 现在 solo 默认采用 mysql,要使用 solo 就需要自己配置 mysql,手动改密码,建库等。显然没有用 h2 方便嘛(不用手动布署数据库)。所以我建议 solo 默认采用 h2 来发布对初次使用的用户更方便嘛。solo 用熟了你想连 mysql,oracle 等其它数据库也是支持的啊。
- 我提这些建议都是为了降低新用户对 solo 初次接触的使用门槛和学习成本,换句话说就是让 solo 对新用户来说更友好一些是有改进空间的嘛。对于博客页面的技术实现,希望也能做一个 jsp 版本的,降低用户的学习成本嘛(要熟练使用 freemarker 也是要花时间学习的嘛);但是用 jsp 再把这些 freemarker 页面重新写一遍也是要增加 solo 团队的时间和人力成本的,所以我回贴里也说了理解。(要说 solo 里这些界面用 jsp 就做不到吗,肯定不是;在 java 程序员里会 jsp 的比会 freemarker 的人少吗,肯定也不是;88250 说了就是因为 jsp 技术老旧了,freemarker 是当下流行技术。By the way, 我把 freemarker 写成 freemake 说明我对它不是很了解嘛,笔误没检查出来请多包涵哈)。
- solo 目前只支持 github 账号登录,这是用户体验上的问题。如果用户能创建自己的用户体验会更好一些,所以我建议加上这个功能,当然 88250 团队也有他们的理由,我也是理解的嘛。
- solo 目前已经做得很成功,有一定水平的开发者看过安装文档从下载到启动一切顺利的情况下可能只用不到 5 分钟时间。但我觉得 solo 还有改进空间,可以更快更方便。比如在开源文档上介绍安装启动时只要一条命令;新用户只用一条命令可能不到 1 分钟时间就能完成开发环境的搭建(solo 据说是面向程序员的博客呢)和博客原型的启动不是更好吗?
好了,在这里把我主贴里的想法说得更清楚了一些,希望能引起大家的思考和讨论,而不是互相攻击抬扛哈。
-
solo 的插件开发,模板开发哪里有文档说明?(顺便修复 JDK11 以上插件加载会报错的问题)
2019-06-28 00:01没错就是这里说的这个问题,JDK11 以上插件加载会报错。看了 github 上处理问题的对话,最后要求降版本到 java1.8 来解决,但是原因可能没有找到,这样会影响整个项目的升级。
这个问题的原因隐藏得较深,问题不是出在 solo 上,而是出在 latke-core 的 org.b3log.latke.plugin.PluginManager 的代码上,问题代码如下:final URLClassLoader classLoader = new URLClassLoader(new URL[]{ defaultClassesFileDirURL, classesFileDirURL}, PluginManager.class.getClassLoader());
首先
defaultClassesFileDirURL
这个变量一般情况下值为null
,在defaultClassesFileDirURL==null
的情况下,new URLClassLoader(new URL[]{ defaultClassesFileDirURL, classesFileDirURL}, PluginManager.class.getClassLoader());
- 在 java1.8 版本情况下运行不会抛出异常;
- 在 java11 以后版本情况下运行会抛出异常;
在抛出异常后插件加载失败。
把上面代码改成如下形式,问题即可解决:
URLClassLoader classLoader=null; if(defaultClassesFileDirURL==null){ classLoader = new URLClassLoader(new URL[]{ classesFileDirURL}, PluginManager.class.getClassLoader()); } else{ classLoader = new URLClassLoader(new URL[]{ defaultClassesFileDirURL, classesFileDirURL}, PluginManager.class.getClassLoader()); }
这个老大难问题解决了,项目版本可以顺利升级了,希望站长能多给些奖励哈。 今天有点晚了,明天我去 github 上提个 PR 吧,早点关闭掉。
-
solo 的插件开发,模板开发哪里有文档说明?(顺便修复 JDK11 以上插件加载会报错的问题)
2019-06-27 10:01回贴有字数限制到 4096,建议扩大一些,很多打印信息贴上来就超了。可以扩到 40960 好些。
-
solo 的插件开发,模板开发哪里有文档说明?(顺便修复 JDK11 以上插件加载会报错的问题)
2019-06-27 09:52我切换成 JDK8 的平台重新编译执行还是会报错:(下面是我加的打印)
pluginDirPaths: [/plugins/kanbanniang/, /plugins/list/, /plugins/symphony-interest/] [ERROR]-[2019-06-27 09:38:33]-[org.b3log.latke.plugin.PluginManager:180]: defaultClassesFileDirURL : /plugins/kanbanniang/classes 目录不存在,插件加载失败! [ERROR]-[2019-06-27 09:38:33]-[org.b3log.latke.plugin.PluginManager:180]: defaultClassesFileDirURL : /plugins/list/classes 目录不存在,插件加载失败! [ERROR]-[2019-06-27 09:38:33]-[org.b3log.latke.plugin.PluginManager:180]: defaultClassesFileDirURL : /plugins/symphony-interest/classes 目录不存在,插件加载失败!
看了一下,这个问题涉及到 latke 的 latke-core 模块,在 latke-core 模块的 org.b3log.latke.plugin.PluginManager 代码中会查找/plugins 目录下的插件对应的 classes 目录:
"/plugins/" + plugin + "/classes"
,如果没有找到这个目录就会抛出异常。跟 JDK 版本没有关系。下面是 solo 的 plugins 目录下的文件结构,你看看跟我的一样吗?(而且都没有 classes 目录)
tree.zip在
solo\src\main\java\org\b3log\solo\plugin
目录下也没有那三个插件对应的 java 源码文件。D:\solo\src\main\java\org\b3log\solo\plugin>tree /f 卷 工作 的文件夹 PATH 列表 卷序列号为 0006-4F18 D:. │ package-info.java │ └─list ListHandler.java
-
Solo 开发环境搭建详细说明(用 MySQL8 数据库,对 Solo 开发指南的环境搭建的补充)
2019-06-26 21:57给你看看我启动 solo 的最后打印信息,跟你的差不多嘛。
[WARN ]-[2019-06-26 21:53:45]-[org.b3log.latke.Latkes:609]: !!!!Runtime mode is [DEVELOPMENT], please make sure configured it with [PRODUCTION] in latke.properties if deployed on production environment!!!! [INFO ]-[2019-06-26 21:53:47]-[org.b3log.solo.util.Markdowns:135]: [markdown-http] is not available, uses built-in [flexmark] for markdown processing. Please read FAQ section in user guide (https://hacpai.com/article/1492881378588) for more details. [INFO ]-[2019-06-26 21:53:47]-[org.b3log.solo.SoloServletListener:99]: Solo is booting [ver=3.6.2, servletContainer=jetty/9.4.12.v20180830, os=Windows 10, isDocker=false, markdownHttpAvailable=false, pid=8436, runtimeDatabase=H2, runtimeMode=DEVELOPMENT, jdbc.username=root, jdbc.URL=jdbc:h2:~/solo_h2/db;MODE=MYSQL] [INFO ]-[2019-06-26 21:53:47]-[com.zaxxer.hikari.HikariDataSource:110]: HikariPool-1 - Starting... [INFO ]-[2019-06-26 21:53:48]-[com.zaxxer.hikari.HikariDataSource:123]: HikariPool-1 - Start completed. pluginDirPaths: [/plugins/kanbanniang/, /plugins/list/, /plugins/symphony-interest/] defaultClassesFileDirURL : /plugins/kanbanniang/classes 目录不存在,插件加载失败! defaultClassesFileDirURL : /plugins/list/classes 目录不存在,插件加载失败! defaultClassesFileDirURL : /plugins/symphony-interest/classes 目录不存在,插件加载失败! [INFO ]-[2019-06-26 21:53:48]-[org.b3log.solo.SoloServletListener:138]: Solo is running Started o.e.j.m.p.JettyWebAppContext@60aa431{/,file:///D:/%E4%B8%AA%E4%BA%BA%E7%9B%B8%E5%85%B3/%E7%A0%81%E4%BA%91%E9%A1%B9%E7%9B%AE/%E5%85%B6%E5%AE%83%E9%A1%B9%E7%9B%AE/solo/src/main/webapp/,AVAILABLE}{file:///D:/%E4%B8%AA%E4%BA%BA%E7%9B%B8%E5%85%B3/%E7%A0%81%E4%BA%91%E9%A1%B9%E7%9B%AE/%E5%85%B6%E5%AE%83%E9%A1%B9%E7%9B%AE/solo/src/main/webapp/} Started ServerConnector@627c6e26{HTTP/1.1,[http/1.1]}{0.0.0.0:8080} Started @41364ms Started Jetty Server
你打开网页试试,我的如下:
-
Solo 开发环境搭建详细说明(用 MySQL8 数据库,对 Solo 开发指南的环境搭建的补充)
2019-06-26 21:52看你提供的打印信息,应该是已经启动成功了。你现在打开浏览器,通过
http://【你的服务器IP】:8080/
访问看看。 -
latke-demo 的 pom.xml 上缺少对 jetty 插件的声明(问题解决)。
2019-06-25 15:32是的,项目的 README 上说有两种方式运行 Demo,其中用 mvn jetty:run 的方式会报错,我目前是发现这种方式有问题,改一下 pom.xml 就好了,就是希望能方便用户使用。
-
Solo 开发指南
2019-06-23 14:21改完 mysql 密码后我们开始手动建库。
mysql> create database solo; Query OK, 1 row affected (0.01 sec)
接下来启动 solo 博客系统,大功告成。
mvn jetty:run
用
http://【你的服务器IP】:8080/
登录系统,初始化博客。
-
Solo 开发指南
2019-06-23 14:18安装并启动了 mysql 后,接下来修改
root@localhost
密码为12345
mysql 在安装后会创建一个 root@locahost 账户(这是 mysql 本地登录的账号。MySQL8.0 为远程连接
root@%
和本地连接root@locahost
提供了不同的密码验证方式。),并且把本地连接初始的密码放到了/var/log/mysqld.log 文件中;用cat /var/log/mysqld.log | grep password
命令查看初始密码。[root@VM_0_11_centos solo]# cat /var/log/mysqld.log | grep password 2019-06-23T03:35:57.941668Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: n=Ti,P4?J(uE
注:上面
n=Ti,P4?J(uE
就是初始密码。使用初始密码登录 mysql
[root@VM_0_11_centos solo]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 8.0.16 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql 的 root 用户的验证方式变了。从下面命令结果可以看出 root 的用户的加密方式为 caching_sha2_passoword,而 navicat 连接所用的方式为 native_password。
mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select host, user, plugin from user; +-----------+------------------+-----------------------+ | host | user | plugin | +-----------+------------------+-----------------------+ | % | root | mysql_native_password | | localhost | mysql.infoschema | caching_sha2_password | | localhost | mysql.session | caching_sha2_password | | localhost | mysql.sys | caching_sha2_password | | localhost | root | caching_sha2_password | +-----------+------------------+-----------------------+ 5 rows in set (0.00 sec)
下面开始修改密码操作,但是直接用 alter 命令改还不行,因为 123456 密太简单,不满足密码策略,查看密码策略命令如下:
mysql> SHOW VARIABLES LIKE 'validate%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | MEDIUM | | validate_password.special_char_count | 1 | +--------------------------------------+--------+ 7 rows in set (0.01 sec)
需要把 validate_password.check_user_name 改为 OFF,validate_password.length 改为 1,validate_password.policy 改为 LOW。命令如下:
mysql> set global validate_password.check_user_name=0; Query OK, 0 rows affected (0.00 sec) mysql> set global validate_password.length=1; Query OK, 0 rows affected (0.00 sec) mysql> set global validate_password.policy=0; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'validate%'; +--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | validate_password.check_user_name | OFF | | validate_password.dictionary_file | | | validate_password.length | 4 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | LOW | | validate_password.special_char_count | 1 | +--------------------------------------+-------+ 7 rows in set (0.00 sec)
然后才可以开始改密码了:(本地和远程的都改为 123456)
mysql> alter user'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.01 sec) mysql> ALTER USER 'root'@'%' IDENTIFIED by '123456'; Query OK, 0 rows affected (0.01 sec) mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
-
Solo 开发指南
2019-06-23 11:19搭建 solo 开发环境要事先安装 jdk,maven,tomcat 和 mysql(solo 默认使用)。下面是在 centos7 上安装 mysql8 的命令步骤:
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum -y mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql-community-server
(从 oracle 官网下载 mysql 速度较慢)systemctl start mysqld.service
(启动 mysql)
-
Solo 开发指南
2019-06-23 10:47按照上述步骤,git clone 后用
mvn jetty:run
运行报错,错误信息应该是说连接 mysql 失败,难道要先装 mysql 吗?不是说集成了 mysql 在项目发布的文件里吗?第一次尝试 solo,谁能帮忙解答一下?谢谢。打印信息如下:[INFO ]-[2019-06-23 10:38:10]-[com.zaxxer.hikari.HikariDataSource:110]: HikariPool-1 - Starting... [ERROR]-[2019-06-23 10:38:11]-[com.zaxxer.hikari.pool.HikariPool:574]: HikariPool-1 - Exception during pool initialization. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ... at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347) Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ... 72 more Caused by: java.net.ConnectException: Connection refused (Connection refused) at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) at java.base/java.net.Socket.connect(Socket.java:591) at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ... 75 more [ERROR]-[2019-06-23 10:38:11]-[org.b3log.solo.service.InitService:186]: Check tables failed, please make sure database existed and database configuration [jdbc.*] in local.props is correct [msg=Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.]
-
Solo 开发指南
2019-06-23 10:17- 建议[Solo 开发指南]上的中文说明改为用码云下载(中文说明主要面向国内用户,国内用户码云下载更快),如下:
git clone --recurse-submodules https://gitee.com/b3logos/solo.git
英文说明(如果有的话)通过 github 下载:
git clone --recurse-submodules https://github.com/b3log/solo.git
- 另外“skins(皮肤)”在码云上没有项目分支,所以也是到 github 上下载的,速度也慢,希望能改进一下,在码云上也能下载,谢谢。
[root@VM_0_11_centos ~]# git clone --recurse-submodules https://gitee.com/b3logos/solo.git Cloning into 'solo'... remote: Enumerating objects: 44272, done. remote: Counting objects: 100% (44272/44272), done. remote: Compressing objects: 100% (13923/13923), done. remote: Total 44272 (delta 24766), reused 44214 (delta 24708) Receiving objects: 100% (44272/44272), 88.66 MiB | 2.85 MiB/s, done. Resolving deltas: 100% (24766/24766), done. Submodule 'src/main/webapp/skins' (https://github.com/b3log/solo-skins) registered for path 'src/main/webapp/skins' Cloning into 'src/main/webapp/skins'... remote: Enumerating objects: 1193, done. remote: Counting objects: 100% (1193/1193), done. remote: Compressing objects: 100% (732/732), done. remote: Total 11743 (delta 845), reused 767 (delta 460), pack-reused 10550 Receiving objects: 100% (11743/11743), 23.59 MiB | 256.00 KiB/s, done. Resolving deltas: 100% (8803/8803), done. Submodule path 'src/main/webapp/skins': checked out 'ca0de62bddd9e3bb8732e46b4239001d7f238303' [root@VM_0_11_centos ~]#
以上是本人下载时的命令打印信息。