Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 弹簧靴,可运行的罐子';t加载package-info.class_Spring_Spring Boot_Jar_Executable Jar_Package Info - Fatal编程技术网

Spring 弹簧靴,可运行的罐子';t加载package-info.class

Spring 弹簧靴,可运行的罐子';t加载package-info.class,spring,spring-boot,jar,executable-jar,package-info,Spring,Spring Boot,Jar,Executable Jar,Package Info,我们使用Spring引导和hibernate数据库映射。 这些实体包含JSON列,这些列映射为使用package info.java文件定义的自定义类型 当我们从EclipseIDE运行spring项目时,一切正常,我们可以调用我们的web服务 当我们生成一个可执行jar并尝试调用我们的web服务时,会出现以下错误: mai 04, 2017 1:35:00 PM org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servle

我们使用Spring引导和hibernate数据库映射。 这些实体包含JSON列,这些列映射为使用package info.java文件定义的自定义类型

当我们从EclipseIDE运行spring项目时,一切正常,我们可以调用我们的web服务

当我们生成一个可执行jar并尝试调用我们的web服务时,会出现以下错误:

mai 04, 2017 1:35:00 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Unable to execute job Test] with root cause
java.lang.NoClassDefFoundError: BOOT-INF/classes/com/test/package-info (wrong name: com/test/package-info)
    at java.lang.ClassLoader.defineClass1(Native Method)
文件package-info.class位于jar BOOT-INF/classes/com/test/package-info中 有什么不对劲


感谢您的帮助

您可以在外部jar中提取包含JAXB生成的类的包(即包含
包信息
类的包)。也将JAXB相关资源(例如XSD文件)转移到新项目

现在,您可以将这样的jar设置为生成可测试jar的项目的依赖项


这样,当我从命令行运行SpringBatch/SpringBoot项目时,它就会工作。我知道这不是一个最佳的解决方案,但在我的例子中,它是有效的。

您可以在外部jar中提取包含JAXB生成的类的包(即包含
包信息的包)。也将JAXB相关资源(例如XSD文件)转移到新项目

现在,您可以将这样的jar设置为生成可测试jar的项目的依赖项


这样,当我从命令行运行SpringBatch/SpringBoot项目时,它就会工作。我知道这不是一个最佳的解决方案,但在我的情况下,它是有效的。

我通过禁用Hibernate的包扫描和自动检测classed来解决这个问题

<persistence-unit name="sqlProvider" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>     
    <class>com.example.package.dao</class>

    .........     
    <properties>
        <property name="exclude-unlisted-classes" value="true"/>
        <property name="hibernate.archive.autodetection" value="hbm" />
        .........
    </properties>
    .........
</persistence-unit>

org.hibernate.jpa.HibernatePersistenceProvider
com.example.package.dao
.........     
.........
.........

我通过禁用包扫描和自动检测classed for Hibernate解决了这个问题

<persistence-unit name="sqlProvider" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>     
    <class>com.example.package.dao</class>

    .........     
    <properties>
        <property name="exclude-unlisted-classes" value="true"/>
        <property name="hibernate.archive.autodetection" value="hbm" />
        .........
    </properties>
    .........
</persistence-unit>

org.hibernate.jpa.HibernatePersistenceProvider
com.example.package.dao
.........     
.........
.........

我不想禁用扫描,因为手动将所有类添加到
持久性。xml
不是一个选项。因为在我们的项目中,我们实际上不使用hibernate的包级注释,所以我创建了一个令人讨厌的小东西:

package com.example;

import org.hibernate.boot.archive.scan.internal.ScanResultImpl;
import org.hibernate.boot.archive.scan.internal.StandardScanner;
import org.hibernate.boot.archive.scan.spi.ScanEnvironment;
import org.hibernate.boot.archive.scan.spi.ScanOptions;
import org.hibernate.boot.archive.scan.spi.ScanParameters;
import org.hibernate.boot.archive.scan.spi.ScanResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;

public class HibernateHackScanner extends StandardScanner {

    private static final Logger log = LoggerFactory.getLogger(HibernateHackScanner.class);

    @Override
    public ScanResult scan(ScanEnvironment environment, ScanOptions options, ScanParameters parameters) {
        log.info("Hack-Scanner is active, annotated packages will not be found by this scanner.");
        ScanResult scan = super.scan(environment, options, parameters);
        return new ScanResultImpl(Collections.emptySet(), scan.getLocatedClasses(), scan.getLocatedMappingFiles());
    }
}
然后我在
persistence.xml
中启用了这个自定义扫描仪:

<property name="hibernate.archive.scanner" value="com.example.HibernateHackScanner"/>


此扫描仪在机罩下使用标准扫描仪,只需丢弃所有在其软件包中预先添加了
boot\u inf.class
等的带注释的软件包。如果您确实需要包级别的注释,那么您需要比这个拐杖更复杂一些。但这对我来说很有用\_(ツ)_/“

我不想禁用扫描,因为手动将所有类添加到
持久性中。xml
不是一个选项。因为我们在项目中实际上不使用hibernate的包级注释,所以我创建了一个令人讨厌的小东西:

package com.example;

import org.hibernate.boot.archive.scan.internal.ScanResultImpl;
import org.hibernate.boot.archive.scan.internal.StandardScanner;
import org.hibernate.boot.archive.scan.spi.ScanEnvironment;
import org.hibernate.boot.archive.scan.spi.ScanOptions;
import org.hibernate.boot.archive.scan.spi.ScanParameters;
import org.hibernate.boot.archive.scan.spi.ScanResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;

public class HibernateHackScanner extends StandardScanner {

    private static final Logger log = LoggerFactory.getLogger(HibernateHackScanner.class);

    @Override
    public ScanResult scan(ScanEnvironment environment, ScanOptions options, ScanParameters parameters) {
        log.info("Hack-Scanner is active, annotated packages will not be found by this scanner.");
        ScanResult scan = super.scan(environment, options, parameters);
        return new ScanResultImpl(Collections.emptySet(), scan.getLocatedClasses(), scan.getLocatedMappingFiles());
    }
}
然后我在
persistence.xml
中启用了这个自定义扫描仪:

<property name="hibernate.archive.scanner" value="com.example.HibernateHackScanner"/>


此扫描仪在引擎盖下使用标准扫描仪,只需丢弃所有在其软件包中预先添加了
boot\u inf.class
等的带注释的软件包。如果您确实需要软件包级别的注释,则需要比这根拐杖更复杂一些。但这对我来说很有用\_(ツ)_/“

我使用
cxf codegen plugin
生成实体。在我的情况下,排除
包信息
类解决了问题。我从项目文件中删除了
包信息.class
,将附加参数添加到pom文件中,如:

 <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>

                <executions>
                          <execution>
                            <id>mvn s</id>
                            <phase>generate-sources</phase>
                            <configuration>
                                <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
                                <sourceRoot>${basedir}/src/main/java</sourceRoot>
                                <wsdlOptions>
                                    <wsdlOption>
                                        <wsdl>${basedir}/src/main/resources/wsdl/YOURWSDL.wsdl</wsdl>
                                        <wsdlLocation>classpath:wsdl/YOURWSDL.wsdl</wsdlLocation>

                                        <bindingFiles>
                                            <bindingFile>${basedir}/src/main/resources/wsdl/bindings.xml</bindingFile>
                                        </bindingFiles>

                                    </wsdlOption>

                                    <wsdlOption>
                                        <wsdl>${basedir}/src/main/resources/wsdl/YOURWSDL.wsdl</wsdl>
                                        <!--<extraargs>-->
                                            <!--<extraarg>-impl</extraarg>-->
                                            <!--<extraarg>-server</extraarg>-->
                                        <!--</extraargs>&ndash;&gt;-->
                                    </wsdlOption>
                                </wsdlOptions>

                                <defaultOptions>
                                    <extraargs>
                                        <extraarg>-xjc-npa</extraarg>
                                    </extraargs>
                                </defaultOptions>

                            </configuration>
                            <goals>
                                <goal>wsdl2java</goal>
                            </goals>
                        </execution>
                </executions>
            </plugin>

org.apache.cxf
cxf-codegen插件
${cxf.version}
mvn s
生成源
${project.build.directory}/generated/cxf
${basedir}/src/main/java
${basedir}/src/main/resources/wsdl/yoursdl.wsdl
类路径:wsdl/YOURWSDL.wsdl
${basedir}/src/main/resources/wsdl/bindings.xml
${basedir}/src/main/resources/wsdl/yoursdl.wsdl
-xjc npa
wsdl2java

和包文件:
mvn clean install spring boot:repackage-DskipTests
。现在它可以正常工作。

我使用
cxf codegen插件
生成实体。在我的情况下,排除
包信息
类解决了问题。我从项目文件中删除了
包信息.class
,向pom文件添加额外参数,如:

 <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>

                <executions>
                          <execution>
                            <id>mvn s</id>
                            <phase>generate-sources</phase>
                            <configuration>
                                <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
                                <sourceRoot>${basedir}/src/main/java</sourceRoot>
                                <wsdlOptions>
                                    <wsdlOption>
                                        <wsdl>${basedir}/src/main/resources/wsdl/YOURWSDL.wsdl</wsdl>
                                        <wsdlLocation>classpath:wsdl/YOURWSDL.wsdl</wsdlLocation>

                                        <bindingFiles>
                                            <bindingFile>${basedir}/src/main/resources/wsdl/bindings.xml</bindingFile>
                                        </bindingFiles>

                                    </wsdlOption>

                                    <wsdlOption>
                                        <wsdl>${basedir}/src/main/resources/wsdl/YOURWSDL.wsdl</wsdl>
                                        <!--<extraargs>-->
                                            <!--<extraarg>-impl</extraarg>-->
                                            <!--<extraarg>-server</extraarg>-->
                                        <!--</extraargs>&ndash;&gt;-->
                                    </wsdlOption>
                                </wsdlOptions>

                                <defaultOptions>
                                    <extraargs>
                                        <extraarg>-xjc-npa</extraarg>
                                    </extraargs>
                                </defaultOptions>

                            </configuration>
                            <goals>
                                <goal>wsdl2java</goal>
                            </goals>
                        </execution>
                </executions>
            </plugin>

org.apache.cxf
cxf-codegen插件
${cxf.version}
mvn s
生成源
${project.build.directory}/generated/cxf
${basedir}/src/main/java