开发中遇到的问题

目录

一、Android

1、无法引用第三方包

2、cvc-complex-type.2.4.a: ��������Ԫ�� 'base-e

3、仓库找不到依赖

4、The specified Gradle installation directory 'xxx' does not exist.

The specified Gradle installation directory XXX\gradle\gradle-2.14.1 - 简书修改

二、Maven

1、如何本地导入jar包并引用

2、本地打开别人的项目时不能下载jar包

3、Web server failed to start. Port 8080 was already in use.

4、spring-boot-starter-parent下面的版本标红

5、非springboot的maven项目打包后的jar包没有包含依赖文件

三、Idea

1、初始化springboot项目时报404

IDEA 创建springboot失败 报错Request failed with status code 403 - 简书

四、Java

1、@Transactional失效


一、Android

1、无法引用第三方包

引用第三方包,首先需要在模块目录下的build.gradle文件的dependences中添加对包的依赖,如下图

然后需要将该包对应的仓库添加到项目的setting.gradle(build.gradle )文件中,即为去该仓库下载对应的包,如下图:

此处如果使用的是http链接可能会因为安全问题失败,需要将其更改成https 

2、cvc-complex-type.2.4.a: ��������Ԫ�� 'base-e

此种问题大概是gradle的各个配置版本不匹配导致,找到 一个可以运行的项目,参考其版本配置进行修改,常见的需要修改的地方:

build.gradle:

 gradle-wrapper.properties:(gradle-6.5-bin.zip | gradle-6.1.1-all.zip)

3、仓库找不到依赖

maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }

4、The specified Gradle installation directory 'xxx' does not exist.

The specified Gradle installation directory XXX\gradle\gradle-2.14.1 - 简书
修改

File -> Setting -> Build,Execution,Deployment -> BuildTools -> Gradle
找到Gradle projects 下面的Gradle -> Use Gradle from -> 下来选择修改为:'gradle-wrapper.properties' file

二、Maven

1、如何本地导入jar包并引用

jar包下载网站:https://mvnrepository.com/,在网站上下载好对应的jar包(或者将自己项目打包成jar包)后,任意路径打开cmd输入如下命令在本地maven仓库中生成对应jar包:

mvn install:install-file -Dfile=C:\Users\xxx\Desktop\xxx.jar -DgroupId=org.xxx -DartifactId=xxx-api -Dversion=1.7.2 -Dpackaging=jar -DgeneratePom=true

DgroupId:是项目组织唯一的标识符,自己随便起名
DartifactId:项目的唯一的标识符,自己可以随便起
Dversion:项目版本
Dfile:jar包路径(绝对路径)
DgeneratePom:是否生成pom文件,ture:生成,false:不生成

首次在cmd中执行该命令可能会报错,貌似是缺少相应插件?转到idea中在任一项目的终端命令行中输入该命令会自动下载对应插件,并安装成功,之后便可直接在cmd中以该命令安装本地jar包。

安装好本地jar包后,在项目的pom文件中输入对应的groupId、artifactId、version,即完成本地jar包的导入。

(如果是网上搜不到的第三方包,只能直接放在项目路径下,在idea中手动右键,将该包加入该项目,最好不用maven导入,否则别人引用无法下载)

2、本地打开别人的项目时不能下载jar包

情况:当打开新项目时,pom文件存在,但是idea右侧未显示maven插件,并且jar包不能自动下载;

解决:点击pom.xml,右键选择add Maven Project即可;(另外,打开非本地的项目时,maven环境配置往往不同,需要修改,可在idea中设置默认maven配置-->default settings中设置)

3、Web server failed to start. Port 8080 was already in use.

原因:莫名其妙java.exe占用了8080端口

解决:查找使用8080端口的进程:netstat -ano |findstr 8080

          查找进程PID对应的程序名:tasklist |findstr "PID"

          查找程序名对应的路径相关信息:wmic process where name="java.exe" get processid,executablepath,name

          根据进程名杀掉进程:taskkill /f /t /im java.exe

4、spring-boot-starter-parent下面的版本标红

roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决 - 雾深 - 博客园

如果某一个版本始终拉不下来,可切换成其他版本,再切换回来重试。

5、非springboot的maven项目打包后的jar包没有包含依赖文件

在pom文件中添加:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.example.demo.HappyChatMain</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <!-- 添加此项后,可直接使用mvn package | mvn install -->
                <!-- 不添加此项,需直接使用mvn package assembly:single -->
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

注意添加<executions>内容,否则不能在右侧的maven中直接点击package打包。

---------------------------------------------

在打包springboot项目时,上述方法仍不能将依赖打入jar包,采用下述方式解决,在pom文件的<build>--><plugins>标签中加入下述:

			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<mainClass>com.upuphone.arcard.demo.DemoApplication</mainClass>
				</configuration>

				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

三、Idea

1、初始化springboot项目时报404


IDEA 创建springboot失败 报错Request failed with status code 403 - 简书

四、Java

1、@Transactional失效


@Transactional事务失效的6种场景_小毛桃学习猿的博客-CSDN博客_transactional事务不生效的场景

还有两种种失效场景:

1、@Transactional注解默认只捕获RuntimeException,如果是其他Exception不会进行捕获,比如SQLException,未捕获则不会进行回滚;需要指定rollbackFor(此时注解在service层)。但 如果注解在controller层,无论rollbackFor 指定与否,亦或指定很小的异常,都会进行拦截。原理尚不晓得

2、在shiro的realm中引入userService后,该userService上的事务失效,其他配置一切正确。这是因为shiro的realm中的bean创建时间早于spring中事务配置,导致事务失效。解决:将userService换成userDao,或者在引入的userService上再加一个注解@Lazy。

2、Bean中有循环依赖

Spring源码最难问题《当Spring AOP遇上循环依赖》_bugpool的博客-CSDN博客_spring循环依赖aop

Spring的单例对象的初始化主要分为三步:

(1)createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象

(2)populateBean:填充属性,这一步主要是多bean的依赖属性进行填充

(3)initializeBean:调用spring xml中的init 方法。

从上面讲述的单例bean初始化步骤我们可以知道,循环依赖主要发生在第一、第二部。也就是构造器循环依赖和field循环依赖。

Spring中循环依赖场景有:
(1)构造器的循环依赖(采用@Lazy注解或者setter注入解决)

(二)构造器注入导致的循环依赖问题及解决方案 - FCity - 博客园
(2)field属性的循环依赖。(三级缓存解决)

三级缓存:

singletonFactories : 单例对象工厂的cache
earlySingletonObjects :提前暴光的单例对象的Cache
singletonObjects:单例对象的cache

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        synchronized (this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    singletonObject = singletonFactory.getObject();
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return (singletonObject != NULL_OBJECT ? singletonObject : null);
}

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(singletonFactory, "Singleton factory must not be null");
    synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            this.singletonFactories.put(beanName, singletonFactory);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }
}

“A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象”这种循环依赖的情况。A首先完成了初始化的第一步,并且将自己提前曝光到singletonFactories中,此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走create流程,B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存singletonObjects(肯定没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过ObjectFactory.getObject拿到A对象(虽然A还没有初始化完全,但是总比没有好呀),B拿到A对象后顺利完成了初始化阶段1、2、3,完全初始化之后将自己放入到一级缓存singletonObjects中。此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2、3,最终A也完成了初始化,进去了一级缓存singletonObjects中,而且更加幸运的是,由于B拿到了A的对象引用,所以B现在hold住的A对象完成了初始化。

Spring-bean的循环依赖以及解决方式_不穿铠甲的穿山甲的博客-CSDN博客_bean的循环依赖如何解决

Spring启动过程+三级缓存+循环依赖详解_西北**孤狼的博客-CSDN博客_springboot三级缓存

spring为什么使用三级缓存而不是两级? - 知乎

3、token验证失败

问题背景:在idea中运行项目在8080端口,用jar包的方式在8081端口再起一个服务;采用shiro+jwt+redis方式验证

问题情况:在8080端口登录后,用该token在8081端口进行访问提示token验证失败(不是超期,是算法签名验证失败);

尝试:在不同路径,起jar包在8082端口,此时,8081与8082端口的token能互用,但不能用于8080端口,证明不是端口或项目运行路径问题;猜测是启动方式问题,根本应该是加密时的secret不同,但是看源码没发现哪里不同,secret、algorithm也打印不出来,暂未找到原因

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值