Eclipse Maven项目:A& B依赖于C,但是B给出类路径错误,而A工作

时间:2016-03-23 17:00:51

标签: java eclipse maven classpath

对于Maven来说,我是一个新手,所以真的很难解决以下问题,因为在这个领域有真正知识的同事已经搬到了新的牧场。真的很感激指向我可能出错的地方;我意识到StackOverflow上一定有很多关于Maven& amp;的问题。 Eclipse类路径,但搜索了其中的一些,我需要用自己的语言提问,因为我缺乏经验 - 抱歉。

附加了一些文件,我希望这些文件足以在纯Maven POM术语中形成相当于SSCCE的文件。 Java本身是无关紧要的,并且具有明显的机密性,但如果需要,我可以提供更多信息。

所以我有一个小型的Maven项目为第三方软件保护加密狗提供了我自己的API(来自Microcosm的DinKey)。该项目被称为dinkeypro,其中有六个类引用了制造商读取/写入加密狗的类,即DinkeyPro.class。这个类保存在DinkeyPro.JAR中,我使用SystemPath作为依赖项引用它,正如您从下面的POM中看到的,我尝试了两种不同的SystemPath规范。仅供参考,请注意制造商要求类文件的包结构为:

uk/microcosm/dinkeydongle/DinkeyPro.class

以下是dinkeypro的POM,为简洁/可读性而删除了不相关的依赖项:

<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>com.xyz</groupId>
  <artifactId>dinkeypro</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>DinkeyPro API</name>

  <build>
    <sourceDirectory>src/main/java</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
       <groupId>dinkeyjar</groupId>
       <artifactId>dinkeyjar</artifactId>
       <scope>system</scope>
       <version>1.0</version>
       <!--<systemPath>${basedir}\src\main\resources\DinkeyPro.jar</systemPath>-->
       <systemPath>C:\Dev\core_dinkeypro\src\main\resources\DinkeyPro.jar</systemPath>
    </dependency>
  </dependencies>

</project>

其他两个Maven项目需要访问加密狗API,&#39;客户端&#39;和&#39;服务器&#39;。它们似乎都指定了与dinkeypro完全相同的Maven依赖(参见下面的POM),尽管如此,客户端和服务器在文件夹方面的结构不同(服务器使用更易识别的src / main / java范例,但客户端没有,并且我想知道这是否是问题的根源。

当客户端项目运行并通过我的API成功读取加密狗时,会发生什么?服务器抛出:

Exception in thread "main" java.lang.NoClassDefFoundError: uk/microcosm/dinkeydongle/DinkeyPro
    at com.xyz.dinkeypro.SoftwareProtectionReadOnlyAgent.isProtectionDevicePresent(SoftwareProtectionReadOnlyAgent.java:73)
    at com.xyz.soft.ServerApp.initialize(ServerApp.java:1200)
    at com.xyz.soft.ServerApp.main(ServerApp.java:310)
Caused by: java.lang.ClassNotFoundException: uk.microcosm.dinkeydongle.DinkeyPro
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 3 more

这是客户端的POM,运行正常:

<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>com.xyz.soft</groupId>
  <artifactId>client</artifactId>
  <version>0.5.0-SNAPSHOT</version>
  <name>client</name>
  <description>client</description>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <resources>
      <resource>
        <directory>src</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>
            <execution>
                <id>copy-resources</id>
                <phase>package</phase>
                <goals>
                  <goal>copy-resources</goal>
                </goals>
                <configuration>
                  <outputDirectory>${basedir}/target</outputDirectory>
                  <resources>
                    <resource>
                      <directory>${basedir}/target-resource</directory>
                      <filtering>true</filtering>
                      <includes>
                        <include>**/*.properties</include>
                      </includes>
                    </resource>
                    <resource>
                      <directory>${basedir}/target-resource</directory>
                      <filtering>false</filtering>
                      <excludes>
                        <exclude>**/*.properties</exclude>
                      </excludes>
                    </resource>
                  </resources>
                  <delimiters>
                    <delimiter>${*}</delimiter>
                  </delimiters>
                </configuration>
            </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <finalName>client</finalName>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.xyz.client.ClientApp</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>com.xyz</groupId>
        <artifactId>dinkeypro</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

以下是具有类路径问题的服务器的POM:

<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>com.xyz.soft</groupId>
  <artifactId>server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>server</name>

  <build>
    <sourceDirectory>src/main/java</sourceDirectory>

    <plugins>

      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <executions>

          <execution>
            <id>additional-target-resources</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
            <includeEmptyDirs>true</includeEmptyDirs>
            <outputDirectory>${basedir}/target</outputDirectory>
              <resources>
                <resource>
                  <directory>${basedir}/target-resources</directory>
                  <filtering>true</filtering>
                  <includes>
                    <include>**/*.properties</include>
                  </includes>
                </resource>
                <resource>
                  <directory>${basedir}/target-resources</directory>
                  <filtering>false</filtering>
                  <excludes>
                    <exclude>**/*.properties</exclude>
                  </excludes>
                </resource>
              </resources>
              <delimiters>
                <delimiter>${*}</delimiter>
              </delimiters>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.4.0</version>
        <executions>
            <execution>
                <id>run</id>
                <phase>integration-test</phase>
                <goals>
                  <goal>java</goal>
                </goals>
                <configuration>
                    <mainClass>com.xyz.server.ServerApp</mainClass>
                </configuration>
            </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <finalName>ebmsCore</finalName>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.xyz.server.ServerApp</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>com.xyz</groupId>
        <artifactId>dinkeypro</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

  </dependencies>
</project>

我检查了构建的客户端和服务器JAR文件的内容。它们都包含在自己的JAR根目录下的DinkeyPro.JAR,并且都可以从根目录导航到com.xyz.dinkeypro。

所以,混乱占主导地位。谁能说清楚我做错了什么?正如您所看到的,我正在努力与Maven保持联系,只是为了将来对dinkeypro API的更改可以直接转到客户端和服务器(以及有朝一日可能需要它的任何其他项目......)。但是,如果这太过于雷区,我可能只需要在服务器项目的资源文件夹中放置一份DinkeyPro.JAR,这样我就可以继续前进了。

非常感谢

0 个答案:

没有答案