化石原创文章,转载请注明来源并保留原文链接


mac机上安装jdk 1.8, jdk10,jdk 11。写一个javafx的界面程序,因原因使用jdk11以下。

写的工程中编译工程,出现java: release version 5 not supported。

工程project structure中,以下几个地方:

1、Project Structure | Project上,Project SDK选的是10,Lauguage Level选的是8。

2、Project Structure | Modules | Sources,Lauguage Level选的是5。

3、Project Structure | Modules | Dependencies,Module SDK选的是10。

4、Platform Settings | SDKs,JDK Home path选的是10的home。

5、Other Settings | Preferences for new projects |Build,Execution,Deployment | Compiler | Java compiler | Project bytecode version,选的是same as language。

尝试把第2项里的5改成10,然后再Rebuild。发现问题依旧。回头在去看第2项的地方,发现还是原来的5,看来这个设置下面改不掉。

因为是maven的工程,于是在pom.xml加入了下面内容:

    <properties>
        <maven.compiler.source>1.10</maven.compiler.source>
        <maven.compiler.target>1.10</maven.compiler.target>
    </properties>

然后必须在pom.xml上点出上下文菜单,reimport。最后再Build |Rebuild Project,问题解决。


1、上面的步骤中,改动pom.xml后reimport是必须要注意的一点

2、添加的内容中,maven.compiler.source可以改成1.8,在上述的环境中也能成功。

3、上面的属性,对应到了工程设置2中的level。maven reimport后可以看出来两者的对应。每次pom.xml的reimport,xml文件里的版本号会影响到工程的这个设置。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


mvn repository解决了很多问题,但是总有例外。比如it.sauronsoftware的base64库,虽然在库里面显示很正常,但是我就是用maven同步不到。

还好可以找到其他的地方下载到jar,还好这个jar并没有其他的依赖。只是一个jar。

下载后我们需要通过mvn安装一下,这样,通过maven建立的工程,可以直接让maven管理,打包的时候就不用自己费心来考虑这个额外的jar。

安装的命令:

mvn install:install-file -DgroupId=it.sauronsoftware "-DartifactId=javabase64" "-Dversion=1.3.1" "-Dpackaging=jar" "-Dfile=E:\lib\javabase64-1.3.1.jar"

上面假设下载的jar在e盘lib文件夹下。

这个命令后,mvn本地仓库里就有了groupId= it.sauronsoftware, artifactId = javabase64, version = 1.3.1的jar。pom里面根据这些信息就可以直接导入。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


背景

一个Intellij,mavn工程。

1、使用了local的jar作为lib

2、使用main()方法作为入口方法

3、使用ftl文件作为模板(FreeMarker)

在使用Intellij开发的时候,没有任何问题。现在要发布到外部机器,希望用户能通过web默认端口80访问。

需要的步骤

1、通过Intellij的maven工具,package命令打包成war文件或者是war同等的文件夹

可能会遇到的问题:

因为使用local的jar,而不是maven reposity的,而local jar是通过File|Project Structure… |Library添加,所以package命令不能成功,遇上这个jar找不到问题。

解决方案:

在项目的pom.xml中,加入使用<systemPath>的<dependency>项,告知maven工具local的jar路径

注意:

如果项目非有springboot initializer生成,那么还需要在pom.xml中加入

<!--  手工设置:让打包成war的设置  -->
<packaging>war</packaging>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

一个完整的的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>wlxsphb</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--  手工设置:让打包成war的设置  -->
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.1-jre</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>it.sauronsoftware</groupId>
            <artifactId>base64</artifactId>
            <version>1.3.1</version>
            <scope>system</scope>
            <systemPath>C:/Users/HanIT/.m2/repository/it/sauronsoftware/base64/javabase64-1.3.1.jar</systemPath>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、在main()中,有初始化的代码,会在springboot模块前后初始化自己的类

可能会遇到的问题:

发布到外部tomcat,这个main就不会被主动运行。tomcat会由spring boot去寻找SpringBootServletInitializer继承类的configure()方法运行(代替这个main)。所以,所有的初始化没有机会,就导致后续的各种错误,而导致服务无法正常,最常见的就是各种NullException的发生。

解决方案:

1、在Override的configure()中,拷贝对应的初始化方法。视confiure()为入口方法。

有了上面两个大前提,把一个这样的web application放置到外部tomcat的步骤就是:

1、删空tomcat webapps下的ROOT文件夹下所有默认文件(这个方式让web application的根目录替代默认的网站根目录)

2、使用maven的package,打包出target下的war,同时会有同名目录放在war旁

3、拷贝这个同名目录到ROOT下,spring boot工程会出两个文件夹,一个为WEB-INF,另外一个为META-INF。WEB-INF中,含两个目录:classes和lib。classes包含的是Intellij项目中java(src目录)下的java代码产生的class(按原目录组织)文件和resources下所有文件(文件夹);lib下是项目中用到的maven引用的其他jar。META-INF文件夹可能是空的。

查错

发布到外部的tomcat,启动服务后,看不到自己的网站页面,或者看页面时见到错误。查错的方式是看tomcat的日志:在tomcat安装目录下,有logs文件夹,启动服务后会出现很多的log文件,主要是stderr字眼的文件和stdout字眼的文件。严重的错误,比如spring boot前就发生的错误,比如configure()方法就发生了导致springboot不能继续的错误,在stderr中能看到。而后续的各种mapping错误,信息等,都可以在stdout中看到。

常见的System.out.println()发出的信息,在这些文件里都会存在。

修改默认的8080端口

打开tomcat安装目录下的conf文件夹下的server.xml,查找8080字眼,应该能看到未注释的如下字眼:

<Connector port="8080" protocol="HTTP/1.1"            connectionTimeout="20000"            redirectPort="8443" />

改动其中的8080到80,保存。然后重启tomcat即可。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


不是所有的库在maven repository都可以找到,所以很多时候我们还是得从第三方网站下载到jar,然后放置到本地。如果是Maven对应的项目,如果不使用maven方式,平时在intellij中调式可能不出问题,但在使用maven的build、compile等等命令的时候,就会发生错误。

这里就需要把本地文件添加到maven的pom.xml中。

下面是一个pom使用本地文件的写法例子:

<dependency>
    <groupId>it.sauronsoftware</groupId>
    <artifactId>base64</artifactId>
    <version>1.3.1</version>
    <scope>system</scope>
    <systemPath>C:/Users/HanIT/.m2/repository/it/sauronsoftware/base64/javabase64-1.3.1.jar</systemPath>
</dependency>

这里重要的是<scope>使用了system,然后用了<systemPath>元素告知本地jar路径。其他的地方都是名字,对应着填即可。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


使用intellij,默认的是国外的服务器,很多时候会下载不到资源。所以还是配置一下阿里云的仓库。

分两个步骤:

1、maven软件的settings修改

该文件名字:settings.xml,路径在maven安装目录的conf文件夹下。打开后,在<mirrors>下加入内容:

<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>        
</mirror>

2、intellij工程的pom.xml修改。下面是一个完整的pom内容,repositories里的相关内容就是需要添加的。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.knk</groupId>
    <artifactId>webcrawl</artifactId>
    <version>1.0-SNAPSHOT</version>

    <repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.10</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>
</project>

化石原创文章,转载请注明来源并保留原文链接