我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MybatisPlus整合Flowable出现错误怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MybatisPlus整合Flowable出现错误怎么解决

这篇文章主要介绍了MybatisPlus整合Flowable出现错误怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus整合Flowable出现错误怎么解决文章都会有所收获,下面我们一起来看看吧。

问题

Description:

file [D:\project\carshow-server\server-flowable\flowable-admin\target\classes\com\carshow\flowable\mapper\IFlowableCommentMapper.class] required a single bean, but 2 were found:
    - sqlSessionFactory: defined by method 'sqlSessionFactory' in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]
    - modelerSqlSessionFactory: defined by method 'modelerSqlSessionFactory' in class path resource [org/flowable/ui/modeler/conf/ModelerDatabaseConfiguration.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

原因

整合的bean冲突,spring找到了两个

查看两个类源码找到对应的bean

MybatisPlus: MybatisPlusAutoConfiguration.class

MybatisPlus整合Flowable出现错误怎么解决

Flowable:ModelerDatabaseConfiguration.class

MybatisPlus整合Flowable出现错误怎么解决

注解解释

@ConditionalOnMissingBean:它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果有注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个,当你注册多个相同的bean时,会出现异常,以此来告诉开发人员。

1. 环境:Flowable6.6

2. 解决:

  • 重写mybatis-plus 自动配置类(由于 flowable-modeler 引入时候,会初始化 mybatis的Template和SqlFactory,这导致 mybatis-plus 本身的autoconfig 无法生效,所以需要重写),从源码中拆写代码:

import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;import com.baomidou.mybatisplus.autoconfigure.SpringBootVFS;import com.baomidou.mybatisplus.core.MybatisConfiguration;import com.baomidou.mybatisplus.core.config.GlobalConfig;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;import com.baomidou.mybatisplus.core.injector.ISqlInjector;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;import org.apache.ibatis.mapping.DatabaseIdProvider;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.context.ApplicationContext;import org.springframework.core.io.ResourceLoader;import org.springframework.util.StringUtils;import javax.sql.DataSource;import java.util.List;public class AbstractMybatisPlusConfiguration {    protected SqlSessionFactory getSqlSessionFactory(            DataSource dataSource,            MybatisPlusProperties properties,            ResourceLoader resourceLoader,            Interceptor[] interceptors,            DatabaseIdProvider databaseIdProvider,            ApplicationContext applicationContext    ) throws Exception {        MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();        factory.setDataSource(dataSource);        factory.setVfs(SpringBootVFS.class);        if (StringUtils.hasText(properties.getConfigLocation())) {            factory.setConfigLocation(resourceLoader.getResource(properties.getConfigLocation()));        }        applyConfiguration(factory, properties);        if (properties.getConfigurationProperties() != null) {            factory.setConfigurationProperties(properties.getConfigurationProperties());        }        if (!ObjectUtils.isEmpty(interceptors)) {            factory.setPlugins(interceptors);        }        if (databaseIdProvider != null) {            factory.setDatabaseIdProvider(databaseIdProvider);        }        if (StringUtils.hasLength(properties.getTypeAliasesPackage())) {            factory.setTypeAliasesPackage(properties.getTypeAliasesPackage());        }        // TODO 自定义枚举包        if (StringUtils.hasLength(properties.getTypeEnumsPackage())) {            factory.setTypeEnumsPackage(properties.getTypeEnumsPackage());        }        if (properties.getTypeAliasesSuperType() != null) {            factory.setTypeAliasesSuperType(properties.getTypeAliasesSuperType());        }        if (StringUtils.hasLength(properties.getTypeHandlersPackage())) {            factory.setTypeHandlersPackage(properties.getTypeHandlersPackage());        }        if (!ObjectUtils.isEmpty(properties.resolveMapperLocations())) {            factory.setMapperLocations(properties.resolveMapperLocations());        }        // TODO 此处必为非 NULL        GlobalConfig globalConfig = properties.getGlobalConfig();        //注入填充器        if (applicationContext.getBeanNamesForType(MetaObjectHandler.class,                false, false).length > 0) {            MetaObjectHandler metaObjectHandler = applicationContext.getBean(MetaObjectHandler.class);            globalConfig.setMetaObjectHandler(metaObjectHandler);        }        //注入主键生成器        if (applicationContext.getBeanNamesForType(IKeyGenerator.class, false,                false).length > 0) {            IKeyGenerator keyGenerator = applicationContext.getBean(IKeyGenerator.class);            globalConfig.getDbConfig().setKeyGenerators((List<IKeyGenerator>) keyGenerator);        }        //注入sql注入器        if (applicationContext.getBeanNamesForType(ISqlInjector.class, false,                false).length > 0) {            ISqlInjector iSqlInjector = applicationContext.getBean(ISqlInjector.class);            globalConfig.setSqlInjector(iSqlInjector);        }        factory.setGlobalConfig(globalConfig);        return factory.getObject();    }    private void applyConfiguration(MybatisSqlSessionFactoryBean factory, MybatisPlusProperties properties) {        MybatisConfiguration configuration = properties.getConfiguration();        if (configuration == null && !StringUtils.hasText(properties.getConfigLocation())) {            configuration = new MybatisConfiguration();        }//        if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {//            for (ConfigurationCustomizer customizer : this.configurationCustomizers) {//                customizer.customize(configuration);//            }//        }        factory.setConfiguration(configuration);    }    public SqlSessionTemplate getSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, MybatisPlusProperties properties) {        ExecutorType executorType = properties.getExecutorType();        if (executorType != null) {            return new SqlSessionTemplate(sqlSessionFactory, executorType);        } else {            return new SqlSessionTemplate(sqlSessionFactory);        }    }}
  • 继承重写的配置类

import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ResourceLoader;import javax.sql.DataSource;@MapperScan(        sqlSessionTemplateRef = "mySqlSessionTemplate",        sqlSessionFactoryRef = "mySqlSessionFactory")@EnableConfigurationProperties(MybatisPlusProperties.class)@Configurationpublic class MybatisPlusConfiguration extends AbstractMybatisPlusConfiguration {    @Bean(name = "mySqlSessionFactory")    public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource,                                                   MybatisPlusProperties properties,                                                   ResourceLoader resourceLoader,                                                   ApplicationContext applicationContext) throws Exception {        return getSqlSessionFactory(dataSource,                properties,                resourceLoader,                null,                null,                applicationContext);    }    @Bean(name = "mySqlSessionTemplate")    public SqlSessionTemplate sqlSessionTemplate(MybatisPlusProperties properties,                                                 @Qualifier("mySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {        return getSqlSessionTemplate(sqlSessionFactory, properties);    }}
  • 重写 flowable-modeler 中 ModelerDatabaseConfiguration,用 @Primary 指定框架内部的mybatis 作为默认的

import liquibase.Liquibase;import liquibase.database.Database;import liquibase.database.DatabaseConnection;import liquibase.database.DatabaseFactory;import liquibase.database.jvm.JdbcConnection;import liquibase.exception.DatabaseException;import liquibase.resource.ClassLoaderResourceAccessor;import lombok.extern.slf4j.Slf4j;import org.apache.ibatis.session.SqlSessionFactory;import org.flowable.common.engine.api.FlowableException;import org.flowable.ui.common.service.exception.InternalServerErrorException;import org.flowable.ui.modeler.properties.FlowableModelerAppProperties;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.ResourceLoader;import org.springframework.core.io.support.ResourcePatternUtils;import javax.sql.DataSource;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.SQLException;import java.util.Properties;@Configuration@Slf4jpublic class DatabaseConfiguration {    protected static final String LIQUIBASE_CHANGELOG_PREFIX = "ACT_DE_";    @Autowired    protected FlowableModelerAppProperties modelerAppProperties;    @Autowired    protected ResourceLoader resourceLoader;    protected static Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();    public static final String DATABASE_TYPE_H2 = "h3";    public static final String DATABASE_TYPE_HSQL = "hsql";    public static final String DATABASE_TYPE_MYSQL = "mysql";    public static final String DATABASE_TYPE_ORACLE = "oracle";    public static final String DATABASE_TYPE_POSTGRES = "postgres";    public static final String DATABASE_TYPE_MSSQL = "mssql";    public static final String DATABASE_TYPE_DB2 = "db2";    public static Properties getDefaultDatabaseTypeMappings() {        Properties databaseTypeMappings = new Properties();        databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);        databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);        databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);        databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);        databaseTypeMappings.setProperty("PostgreSQL", DATABASE_TYPE_POSTGRES);        databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL);        databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2);        return databaseTypeMappings;    }    @Bean    @Primary    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) {        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSource);        String databaseType = initDatabaseType(dataSource);        if (databaseType == null) {            throw new FlowableException("couldn't deduct database type");        }        try {            Properties properties = new Properties();            properties.put("prefix", modelerAppProperties.getDataSourcePrefix());            properties.put("blobType", "BLOB");            properties.put("boolValue", "TRUE");            properties.load(this.getClass().getClassLoader().getResourceAsStream("org/flowable/db/properties/" + databaseType + ".properties"));            sqlSessionFactoryBean.setConfigurationProperties(properties);            sqlSessionFactoryBean                    .setMapperLocations(ResourcePatternUtils.getResourcePatternResolver(resourceLoader).getResources("classpath:/META-INF/modeler-mybatis-mappings/*.xml"));            sqlSessionFactoryBean.afterPropertiesSet();            return sqlSessionFactoryBean.getObject();        } catch (Exception e) {            throw new FlowableException("Could not create sqlSessionFactory", e);        }    }    @Primary    @Bean(destroyMethod = "clearCache") // destroyMethod: see https://github.com/mybatis/old-google-code-issues/issues/778    public SqlSessionTemplate SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {        return new SqlSessionTemplate(sqlSessionFactory);    }    @Bean    public Liquibase liquibase(DataSource dataSource) {        log.info("Configuring Liquibase");        Liquibase liquibase = null;        try {            DatabaseConnection connection = new JdbcConnection(dataSource.getConnection());            Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(connection);            database.setDatabaseChangeLogTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogTableName());            database.setDatabaseChangeLogLockTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogLockTableName());            liquibase = new Liquibase("META-INF/liquibase/flowable-modeler-app-db-changelog.xml", new ClassLoaderResourceAccessor(), database);            liquibase.update("flowable");            return liquibase;        } catch (Exception e) {            throw new InternalServerErrorException("Error creating liquibase database", e);        } finally {            closeDatabase(liquibase);        }    }    protected String initDatabaseType(DataSource dataSource) {        String databaseType = null;        Connection connection = null;        try {            connection = dataSource.getConnection();            DatabaseMetaData databaseMetaData = connection.getMetaData();            String databaseProductName = databaseMetaData.getDatabaseProductName();            log.info("database product name: '{}'", databaseProductName);            databaseType = databaseTypeMappings.getProperty(databaseProductName);            if (databaseType == null) {                throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");            }            log.info("using database type: {}", databaseType);        } catch (SQLException e) {            log.error("Exception while initializing Database connection", e);        } finally {            try {                if (connection != null) {                    connection.close();                }            } catch (SQLException e) {                log.error("Exception while closing the Database connection", e);            }        }        return databaseType;    }    private void closeDatabase(Liquibase liquibase) {        if (liquibase != null) {            Database database = liquibase.getDatabase();            if (database != null) {                try {                    database.close();                } catch (DatabaseException e) {                    log.warn("Error closing database", e);                }            }        }    }}

关于“MybatisPlus整合Flowable出现错误怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“MybatisPlus整合Flowable出现错误怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MybatisPlus整合Flowable出现错误怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MybatisPlus整合Flowable出现错误怎么解决

这篇文章主要介绍了MybatisPlus整合Flowable出现错误怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus整合Flowable出现错误怎么解决文章都会有所收获,下面我们一起
2023-07-05

MybatisPlus+Postgresql整合的坑怎么解决

本篇内容主要讲解“MybatisPlus+Postgresql整合的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MybatisPlus+Postgresql整合的坑怎么解决”吧!基础
2023-07-05

出现 java.lang.NoSuchMethodError错误怎么解决

这篇文章将为大家详细讲解有关出现 java.lang.NoSuchMethodError错误怎么解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。解决 java.lang.NoSuchMet
2023-05-31

Windows出现​CoCreateInstance错误怎么解决

CoCreateInstance错误是由于无法创建指定的COM组件实例所引起的。要解决这个问题,可以尝试以下步骤:确认COM组件是否已正确安装:打开控制面板,点击“程序”或“程序和功能”,查找并确认所需的COM组件是否已正确安装。如果没有安
2023-10-21

SQL出现5120错误怎么解决

SQL Server 错误 5120 是由于没有足够的权限来访问或操作指定的数据库或文件引起的。以下是解决此问题的几种方法:1. 检查登录用户是否具有足够的权限来访问或操作该数据库。确保该用户具有正确的权限,例如 sysadmin、db_o
2023-09-22

Oracle出现ora-12154错误怎么解决

ORA-12154错误通常表示Oracle客户端无法解析数据库的连接信息。以下是一些常见的解决方法:确保tnsnames.ora文件存在且位于正确的位置。tnsnames.ora文件包含了数据库的连接信息,它通常位于$ORACLE_HOME
2023-10-23

myeclipse运行出现错误怎么解决

当MyEclipse运行出现错误时,你可以尝试以下解决方法:1. 重启MyEclipse:有时候重启软件可以解决一些临时性的问题。2. 检查错误日志:在MyEclipse安装目录下的"configuration"文件夹中,打开"logs"文
2023-08-18

tomcat6.0运行出现错误怎么解决

要解决Tomcat 6.0运行出现的错误,可以尝试以下几种方法:1. 检查Tomcat配置文件:确保配置文件(如server.xml)中的端口号、文件路径等设置正确,并且没有语法错误。2. 查看Tomcat日志文件:打开Tomcat日志文件
2023-08-18

Win8开机出现错误C00000022怎么解决

本篇内容主要讲解“Win8开机出现错误C00000022怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Win8开机出现错误C00000022怎么解决”吧!解决方法:一、重启电脑,接着按住
2023-06-28

windows出现错误码0x803f8001怎么解决

本篇内容主要讲解“windows出现错误码0x803f8001怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows出现错误码0x803f8001怎么解决”吧!出现错误码0x803
2023-07-01

delphi调用dll出现错误怎么解决

要解决Delphi调用DLL出现错误,可以按照以下步骤进行尝试:确认DLL文件路径是否正确:检查DLL文件是否在正确的路径下,包括文件名和文件扩展名是否正确。确认DLL文件是否与Delphi版本兼容:某些DLL文件可能与特定版本的Delph
2023-10-25

SQL语句出现ora06502错误怎么解决

ORA-06502错误通常是由于数据类型不匹配引起的,可能有以下几种原因和解决方法:1. 传递的参数与目标变量的数据类型不匹配。请确保传递的参数类型与目标变量的数据类型一致。2. 字符串长度超过了目标变量的长度限制。请检查字符串长度是否超过
2023-10-18

mysql连接出现1045错误怎么解决

MySQL的错误代码1045表示访问被拒绝,通常是由于用户名或密码错误导致的。要解决此问题,可以按照以下步骤操作:1. 确认用户名和密码是否正确:检查MySQL连接的用户名和密码是否正确,确保没有输入错误。2. 检查MySQL服务器是否正在
2023-08-11

VC出现unresolved external symbol错误怎么解决

"unresolved external symbol"错误通常发生在链接阶段,表示编译器找不到某个函数或变量的定义。解决这个错误的方法有以下几种:1. 确保函数或变量的定义和声明一致:检查函数或变量的定义和声明,确保它们的参数类型、返回类
2023-08-08

C++调用AdjustTokenPrivileges出现错误怎么解决

调用AdjustTokenPrivileges函数时可能会出现错误,常见的错误有以下几种:ERROR_NOT_ALL_ASSIGNED (1300):表示没有分配所有请求的特权。这通常是由于没有足够的权限来修改特权。解决方法:确保当前用户有
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录