plugins_plugins爆红 - CSDN
精华内容
参与话题
  • plugins

    2020-04-21 16:59:14
    MyBatis allows you to intercept calls to at certain points within the execution of a mapped statement. By default, MyBatis allows plug-ins to intercept method calls of: Executor (update, query, flushS...

    MyBatis allows you to intercept calls to at certain points within the execution of a mapped statement. By default, MyBatis allows plug-ins to intercept method calls of:

    Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
    ParameterHandler (getParameterObject, setParameters)
    ResultSetHandler (handleResultSets, handleOutputParameters)
    StatementHandler (prepare, parameterize, batch, update, query)
    

    The details of these classes methods can be discovered by looking at the full method signature of each, and the source code which is available with each MyBatis release. You should understand the behaviour of the method you’re overriding, assuming you’re doing something more than just monitoring calls. If you attempt to modify or override the behaviour of a given method, you’re likely to break the core of MyBatis. These are low level classes and methods, so use plug-ins with caution.

    Using plug-ins is pretty simple given the power they provide. Simply implement the Interceptor interface, being sure to specify the signatures you want to intercept.

    // ExamplePlugin.java
    @Intercepts({@Signature(
    type= Executor.class,
    method = “update”,
    args = {MappedStatement.class,Object.class})})
    public class ExamplePlugin implements Interceptor {
    private Properties properties = new Properties();

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
    // implement pre-processing if needed
    Object returnObject = invocation.proceed();
    // implement post-processing if needed
    return returnObject;
    }

    @Override
    public void setProperties(Properties properties) {
    this.properties = properties;
    }
    }

    The plug-in above will intercept all calls to the “update” method on the Executor instance, which is an internal object responsible for the low-level execution of mapped statements.

    NOTE Overriding the Configuration Class

    In addition to modifying core MyBatis behaviour with plugins, you can also override the Configuration class entirely. Simply extend it and override any methods inside, and pass it into the call to the SqlSessionFactoryBuilder.build(myConfig) method. Again though, this could have a severe impact on the behaviour of MyBatis, so use caution.

    展开全文
  • Mybatis配置文件之plugins使用

    千次阅读 2017-09-05 09:32:18
    plugins是什么 案例实现分页 interceptor 自定义Interceptor 配置插件 分页实践 分页插件 分页封装类 分页插件 拦截StatementHandler-prepare方法 prepare code 源码 拦截实现分析 处理链路 路由处理...

    博由

        接着配置文件的问题,在描述完了如何使用typeHandler之后,接下来本文主要讲述如何使用plugins相关内容,以及从源码角度分析其基本原理。
    • 1
    save_snippets.png

    plugins是什么?

        简单理解为拦截器,既然是拦截器说白了一般都是动态代理来实现对目标方法的拦截,在前后做一些操作。
        在mybatis将这种东西,称之为plugin,配置在mybatis-config.xml配置文件中,通过 <plugins></plugins>标签配置。在mybatis中,可以被拦截的目标主要是:
        1. StatementHandler;
        2. ParameterHandler;
        3. ResultSetHandler;
        4. Executor;
        我们同一个简单的分页查询来解释一般plugin的使用方法;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    save_snippets.png

    案例(实现分页)

    案例:ByPage后缀的查询,自动执行分页操作;不需要显性的limit SQL操作;
    • 1
    save_snippets.png

    interceptor

    通过实现Interceptor接口,来自定义plugin,

    public interface Interceptor {
      // 拦截逻辑,参数是代理类
      Object intercept(Invocation invocation) throws Throwable;
      // 加载插件,一般使用Plugin.wrap(target, this);加载当前插件
      Object plugin(Object target);
      // 初始化属性
      void setProperties(Properties properties);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    save_snippets.png

    自定义Interceptor

    可以通过implements Interceptor来自定义plugin,但是仅仅这样是不行的,额外需要通过@Inteceptors和@Signature源注解来指定拦截器需要拦截的目标(类、方法、参数);

    @Intercepts(value={
        @Signature(
            type = Executor.class, // 只能是: StatementHandler | ParameterHandler | ResultSetHandler | Executor 类或者子类
            method = "query", // 表示:拦截Executor的query方法
            args = {  // query 有很多的重载方法,需要通过方法签名来指定具体拦截的是那个方法
                    MappedStatement.class,
                    Object.class,
                    RowBounds.class,
                    ResultHandler.class
            }
            /**
             * type:标记需要拦截的类
             * method: 标记是拦截类的那个方法
             * args: 标记拦截类方法的具体那个引用(尤其是重载时)
             */
        )})
    public class LogPlugin implements Interceptor{
    
        /**
         * 具体拦截的实现逻辑
         * @param invocation
         * @return
         * @throws Throwable
         */
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
    
            System.out.println("----------- intercept query start.... ---------");
    
            // 调用方法,实际上就是拦截的方法
            Object result = invocation.proceed();
    
            System.out.println("----------- intercept query end.... ---------");
    
            return result;
        }
    
        // 插入插件
        @Override
        public Object plugin(Object target) {
            return Plugin.wrap(target, this); // 调用Plugin工具类,创建当前的类的代理类
        }
    
        // 设置插件属性
        @Override
        public void setProperties(Properties properties) {
    
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    save_snippets.png

    配置插件

    <plugins>
    <plugin interceptor="com.plugins.interceptors.LogPlugin" />    
    </plugins>
    • 1
    • 2
    • 3
    save_snippets.png

    完成上述两个步骤就可以使用插件了,接下来我们具体到分页案例来进行。

    分页实践

    分页插件

    分析:
    1. 分页封装对象:Pager;
    2. ThreadLocal存放每个线程的分页对象;
    3. 分页操作是两个步骤:
       3.1 分页查询,需要进行拼装limit sql;
       3.2 总数量查询,需要进行数量查询内置操作;
    4. 可以拦截StatementHandler的prepare方法,对SQL信息进行修改并重新组装,然后进行查询相关操作。
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    save_snippets.png

    分页封装类

    package com.plugins.entity;
    
    import java.io.Serializable;
    import java.util.List;
    
    /**
     * 分页类
     * Created by wangzhiping on 17/3/10.
     */
    public class Pager<T> implements Serializable{
    
        /**
         * 开始位置
         */
        private int startPos;
    
        /**
         * 当前页码
         */
        private int curPage;
    
        /**
         * 每页大小
         */
        private int pageSize;
    
        /**
         * 每一页的数据
         */
        private List<T> datas;
    
        /**
         * 总页数
         */
        private int totalPage;
    
        /**
         * 总数量
         */
        private int totalCount;
    
        public Pager(int curPage, int pageSize) {
            this.curPage = curPage;
            this.pageSize = pageSize;
    
            this.startPos = (this.curPage - 1) * this.pageSize;
        }
    
        public int getStartPos() {
            return startPos;
        }
    
        public void setStartPos(int startPos) {
            this.startPos = startPos;
        }
    
        public int getCurPage() {
            return curPage;
        }
    
        public void setCurPage(int curPage) {
            this.curPage = curPage;
        }
    
        public int getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
        public List<T> getDatas() {
            return datas;
        }
    
        public void setDatas(List<T> datas) {
            this.datas = datas;
        }
    
        public int getTotalPage() {
            return totalPage;
        }
    
        public void setTotalPage(int totalPage) {
            this.totalPage = totalPage;
        }
    
        public int getTotalCount() {
            return totalCount;
        }
    
        public void setTotalCount(int totalCount) {
            this.totalCount = totalCount;
            this.totalPage = (this.totalCount - 1) / this.pageSize + 1;
        }
    
        @Override
        public String toString() {
            return "Pager{" +
                    "startPos=" + startPos +
                    ", curPage=" + curPage +
                    ", pageSize=" + pageSize +
                    ", datas=" + datas +
                    ", totalPage=" + totalPage +
                    ", totalCount=" + totalCount +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    save_snippets.png

    分页插件

    拦截StatementHandler-prepare方法
    @Intercepts(value={
    @Sigunature(
        type = StatementHandler.class, // 拦截目标类
        method = "prepare", // 目标类的目标方法
        args = { // prepare参数列表的参数类型
            Connection.class, 
            Integer.class
        }
    )
    })
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    save_snippets.png
    prepare code <源码>
    Statement prepare(
        Connection connection, 
        Integer transactionTimeout
    )throws SQLException;
    实际上述的拦截就是拦截的StatementHandler -> prepare method
    • 1
    • 2
    • 3
    • 4
    • 5
    save_snippets.png
    拦截实现分析
    处理链路
    |--- StatementHandler
    |--- --- RoutingStatementHandler
    |--- --- BaseStatementHandler
    |--- --- --- PreparedStatementHandler
    • 1
    • 2
    • 3
    • 4
    save_snippets.png
    路由处理(RoutingStatementHandler)
    switch (ms.getStatementType()) {
          case STATEMENT:
            delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
            break;
          case PREPARED:
            delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); // 路由到Prepared
            break;
          case CALLABLE:
            delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
            break;
          default:
            throw new ExecutorException("Unknown statement type: " + ms.getStatementType());
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    save_snippets.png
    实际处理(PreparedStatementHandler|BaseStatementHandler )

    BaseStatementHandler.java

    @Override
      public Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException {
        ErrorContext.instance().sql(boundSql.getSql());
        Statement statement = null;
        try {
          // 实例化Statement
          statement = instantiateStatement(connection);
          // 设置操作超时时间
          setStatementTimeout(statement, transactionTimeout);
          // 设置获取大小
          setFetchSize(statement);
          return statement;
        } catch (SQLException e) {
          closeStatement(statement);
          throw e;
        } catch (Exception e) {
          closeStatement(statement);
          throw new ExecutorException("Error preparing statement.  Cause: " + e, e);
        }
      }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    save_snippets.png

    PreparedStatementHandler.java

    @Override
      protected Statement instantiateStatement(Connection connection) throws SQLException {
        //调用Connection.prepareStatement
        String sql = boundSql.getSql();
        if (mappedStatement.getKeyGenerator() instanceof Jdbc3KeyGenerator) {
          String[] keyColumnNames = mappedStatement.getKeyColumns();
          if (keyColumnNames == null) {
            return connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
          } else {
            return connection.prepareStatement(sql, keyColumnNames);
          }
        } else if (mappedStatement.getResultSetType() != null) {
          return connection.prepareStatement(sql, mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY);
        } else {
          return connection.prepareStatement(sql);
        }
      }
      // SQL参数化处理
      @Override
      public void parameterize(Statement statement) throws SQLException {
        //调用ParameterHandler.setParameters
        parameterHandler.setParameters((PreparedStatement) statement);
      }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    save_snippets.png
    如何操作达到分页操作

    获取SQL信息(BoundSql)

    | --- RoutingStatementHandler(delegate)
    | --- --- delegate = PreparedStatementHandler
    | --- --- PreparedStatementHandler -> BaseStatementHandler
    • 1
    • 2
    • 3
    save_snippets.png

    包含了BoundSql、MappedStatement等

    protected final Configuration configuration;
    protected final ObjectFactory objectFactory;
    protected final TypeHandlerRegistry typeHandlerRegistry;
    protected final ResultSetHandler resultSetHandler;
    protected final ParameterHandler parameterHandler;
    protected final Executor executor;
    protected final MappedStatement mappedStatement;
    protected final RowBounds rowBounds;
    protected BoundSql boundSql;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    save_snippets.png

    获取StatementId(MappedStatement)

    我们需要获取BaseStatementHandler中的mappedStatement属性,但是这些属性都是protected,没哟继承结构无法直接访问,在mybatis可以通过metaObject来访问。
    // 实际上就是获取某个目标对象的属性操作
    MetaObject metaObject = MetaObject.forObject(
    handler,
    SystemMetaObject.DEFAULT_OBJECT_FACTORY,             SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,
    new DefaultReflectorFactory()
    ); 
    
    // metaObject.getValue获取属性(ognl表达式获取)
    MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    save_snippets.png

    执行SQL的数量查询

    Connection conn = (Connection) invocation.getArgs()[0];
    PreparedStatement ps = conn.prepareStatement(countSql);
    
    // 获取参数处理器来处理参数
    // 通过ParameterHandler来参数化SQL
    ParameterHandler ph = (ParameterHandler) 
    metaObject.getValue("delegate.parameterHandler");
    ph.setParameters(ps);
    
    // 执行查询
    ResultSet rs = ps.executeQuery();
    if(rs.next()){
       pager.setTotalCount(rs.getInt(1));
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    save_snippets.png

    注入limit sql

    // 修改SQL
    String pageSql = sql + " LIMIT " + pager.getStartPos() + ", " + pager.getPageSize();
    // 重新设定BoundSql的SQL属性
    metaObject.setValue("delegate.boundSql.sql", pageSql);
    • 1
    • 2
    • 3
    • 4
    save_snippets.png
    代码实现
    @Intercepts(value = {@Signature(
            type = StatementHandler.class,
            method = "prepare",
            args = {
                    Connection.class,
                    Integer.class
            }
    )})
    public class ThreadLocalPagePlugin implements Interceptor{
    
        /**
         * 这个方法是实际的拦截逻辑,我们的目的是在这里来实现分页,需要达到什么程度的使用。
         * 假设从ThreadLocal获取分页信息,来进行分页操作;
         * @param invocation
         * @return
         * @throws Throwable
         */
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
    
            // 获取目标对象,注意StatementHandler中的属性都是protected
            // 不能直接访问,因此需要通过其他的方式来获取,就是MetaObject
            // 其基本实现是BaseStatementHandler其中最重要的属性是MappedStatment
            // 包含了SQL相关信息
    
            // 实际返回的是RoutingStatementHandler
            StatementHandler handler = (StatementHandler) invocation.getTarget();
    
            // 获取指定对象的元信息
            MetaObject metaObject = MetaObject.forObject(
                    handler,
                    SystemMetaObject.DEFAULT_OBJECT_FACTORY,
            SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,
                    new DefaultReflectorFactory()
            );
    
            // 然后就可以通过MetaObject获取对象的属性
            // 获取RoutingStatementHandler->PrepareStatementHandler->BaseStatementHandler中的mappedStatement
            // mappedStatement 包含了Sql的信息
            MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
    
            // 获取statement id
            String statementId = mappedStatement.getId();
    
            // 会拦截每个属性
            if (statementId.endsWith("ByPage")){
                // ByPage 表示的是分页查询
                BoundSql boundSql = handler.getBoundSql();
    
                String sql = boundSql.getSql();
    
                // 获取当前线程分页信息
                Pager<?> pager =  ThreadLocalUtil.threadLocal.get();
    
                String countSql = "SELECT COUNT(*) " + sql.substring(sql.indexOf("FROM"));
    
                Connection conn = (Connection) invocation.getArgs()[0];
                PreparedStatement ps = conn.prepareStatement(countSql);
    
                // 获取参数处理器来处理参数
                ParameterHandler ph = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");
                ph.setParameters(ps);
    
                // 执行查询
                ResultSet rs = ps.executeQuery();
                if(rs.next()){
                    pager.setTotalCount(rs.getInt(1));
                }
    
                String pageSql = sql + " LIMIT " + pager.getStartPos() + ", " + pager.getPageSize();
    
                metaObject.setValue("delegate.boundSql.sql", pageSql);
            }
    
    
            return invocation.proceed();
        }
    
        // 指定需要拦截的对象
        @Override
        public Object plugin(Object target) {
            return Plugin.wrap(target, this);
        }
    
        // 初始化属性
        @Override
        public void setProperties(Properties properties) {
    
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    save_snippets.png
    配置
    <plugins>
            <plugin interceptor="com.plugins.interceptors.ThreadLocalPagePlugin" />
        </plugins>
    • 1
    • 2
    • 3
    save_snippets.png
    Mapper.xml
    <select id="findByPage" resultType="User">
            SELECT *
            FROM user
    </select>
    • 1
    • 2
    • 3
    • 4
    save_snippets.png
    单元测试
    @Test
    public void testQueryPageByPlugin() {
    
            SqlSession session = instance.getSession();
    
            Pager<User> pager = new Pager<User>(1, 10);
            ThreadLocalUtil.threadLocal.set(pager);
    
            List<User> users = session.selectList(User.class.getName() + ".findByPage");
            pager.setDatas(users);
    
            System.out.print(pager);
    
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    save_snippets.png

    总结

    通过实现一个简单分页的代码而言,要想真正了解plugin的使用,需要真正了解StatementHandler|ParameterHandler|ResultSetHandler|Executor
    这四个类的执行链路和原理,只有了解到这些你才能知道,在哪里拦截,拦截什么,怎么拦截。
    • 1
    • 2
    save_snippets.png

    项目地址

    branch v1.4: https://github.com/wzpthq/csdn_mybatis.git


    展开全文
  • plugins和pluginManagement的区别概述 plugins 和 pluginManagement 的区别,和我们前面研究过的 dependencies 和 dependencyManagement 的区别是非常类似的。plugins 下的 plugin 是真实使用的,而 ...

    plugins和pluginManagement的区别概述


    pluginspluginManagement 的区别,和我们前面研究过的 dependenciesdependencyManagement 的区别是非常类似的。plugins 下的 plugin 是真实使用的,而 pluginManagement 下的 plugins 下的 plugin 则仅仅是一种声明,子项目中可以对 pluginManagement 下的 plugin 进行信息的选择、继承、覆盖等。

    pluginManagement使用实战


    假如存在两个项目,项目A为项目B的父项目,其关系通过pom文件的关系确定。项目A的父pom文件片段如下:

    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <attach>true</attach>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>

    如果项目B也想使用该plugin配置,则在项目B的子pom文件中只需要如下配置:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
        </plugin>
    </plugins>

    我们可以看到,子pom文件中,省去了版本、配置细节等信息,只需要指定groupId和artifactId,其他信息均从父pom文件继承。当然,如果子pom文件想定制自己的特定内容,可以另行设置,并会覆盖从父pom文件继承到的内容。

    需要注意的是,dependenciesdependencyManagement 均是 project 下的直接子元素,但是 pluginspluginManagement 却是 project 下 build 的直接子元素。

    展开全文
  • plugins-&gt;Browse repositories-&gt;需要安装的插件的名字-&gt;install 安装成功后重启IDEA 但是有时候会失败,我把下载地址放到浏览器里网址确实打不开,没有去开VPN进行尝试,想试的可以自己试试...

    一.一般的插件安装方式
    File->Setting->plugins->Browse repositories->需要安装的插件的名字->install
    安装成功后重启IDEA
    但是有时候会失败,我把下载地址放到浏览器里网址确实打不开,没有去开VPN进行尝试,想试的可以自己试试看,具体原因先不深究,先把问题解决了就好
    这里写图片描述
    二.离线下载插件
    1.访问http://plugins.jetbrains.com/
    2.输入你想下载的插件名字
    这里写图片描述
    3.选择合适的版本进行下载
    这里写图片描述
    4.再次回到IDEA,重复File->setting->plugins->Install plugin from disk…->restart IDEA

    展开全文
  • IDEA 2019 plugins 插件搜索不出结果解决方法

    万次阅读 多人点赞 2019-07-26 13:16:41
    proxy的url输入:http://127.0.0.1:1080 重启idea即可
  • IDE工具(38) IDEA Plugins中搜索不到任何插件解决办法

    万次阅读 多人点赞 2020-01-21 21:12:56
    如图,今天因项目需要lombok插件,结果在Marketplace中搜不到任何插件 也因此在网上百度查找了很多解决方法,如下idea设置: 按照上面的方法试了之后都不行,...http://plugins.jetbrains.com/ 在Version Hist...
  • 【webpack】插件 plugins

    千次阅读 2019-08-21 11:09:54
    插件(plugins) 插件是 webpack 的支柱功能。插件目的在于解决 loader 无法实现的其他事。 webpack 插件是一个具有 apply 属性的 JavaScript 对象。apply 属性会被 webpack compiler 调用,并且 compiler 对象可在...
  • plugins插件

    2020-07-28 23:32:48
    plugins插件
  • IDEA项目里Maven 的Plugins出现红线的解决方法

    万次阅读 热门讨论 2018-01-12 09:01:07
    1.删除项目里的libraries(快捷键ctrl+shift+alt+s):Project Settings-》Libraries,全选删除 2.删除之前项目产生的target 3.然后再install 和Reimport 步骤如下
  • Idea2019:“marketplace plugins are not loaded”或Plugins搜不到插件 最近想用家里的Idea装一个插件,结果怎么都搜不到,如下图(图片来源网络),几分钟之后提示:“marketplace plugins are not loaded”; 网上...
  • 关于Unity Plugins文件夹

    千次阅读 2015-06-08 14:51:05
    如果Plugins文件夹中存在”Plugins/x86”和”Plugins/x86_64”这两个文件夹,则dll必须放入这两个文件夹中,否则会出现找不到dll的情况
  • 下载新的版本提供了插件管理器,但是需要自行下载安装。 下载路径: https://jmeter-plugins.org/downloads/all/...Jmeter 插件安装打开 Plugins Manager 菜单,在可获得的插件列表中选择自己需要的插件进行
  • “Plugin Error Problems found loading plugins”。 2. 分析与解决: 显然,是Plugin的问题。 解决: 在android studio中,“File”->"Settings..." ->"Plugins"中,发现Android Support没有被
  • 问题:Some problems were encountered while building the effective model for ...[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-...
  • 用Intellij idea新建的项目,想要用jetty运行了,可是发现右侧的Maven Projects 选项卡中的plugins消失了,怎么办? 答案是右击选项卡中项目名称上面的类似刷新的按钮:Reimport All Maven Projects, 然后Plugins...
  • 关于idea的springboot项目的Plugins和Dependencies没有显示的原因 在maven的pom.xml里的依赖没有加载完全的时候,会出现Plugins和Dependencies没有显示的现象,只要把maven的pom.xml里的依赖加载完全就会出现...
  • 关于IDEA 的 plugins 搜不到任何的东西解决办法 ** 我在Intellij IDEA 2018中搜索安装我们想要的插件时,有时候发现打开Setting->Plugins,Marketplace搜索插件页面加载不出来。而且搜索插件也搜索不出来。 如果...
  • 尝试了去本地库删除重新下载之后依然没有解决 后发现是这里填写不一致导致
  • yum install的时候提示:Loaded plugins: fastestmirrorfastestmirror是yum的一个加速插件,这里是插件提示信息是插件不能用了。不能用就先别用呗,禁用掉,先yum了再说。1.修改插件的配置文件# vi /etc/yum/...
  • 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 264, column 16 plugin缺少版本号 加入解决 &lt;version&gt;3.6.0&lt;/version&gt;
1 2 3 4 5 ... 20
收藏数 424,183
精华内容 169,673
关键字:

plugins