Showing posts with label Build. Show all posts
Showing posts with label Build. Show all posts

Maven: Non Existing Library jdk.tools.jar


The Problem
Today,after add some dependencies to maven,  I found that maven refuses to compile. In Problems view, it shows error:
The container 'Maven Dependencies' references non existing library 'C:\Users\administrator\.m2\repository\jdk\tools\jdk.tools\1.6\jdk.tools-1.6.jar'

Check my pom.xml, there is no direct dependency of jdk.tools-1.6.jar, then use maven dependency:tree tool to figure out which lib indirectly depends on it.
mvn dependency:tree -Dverbose -Dincludes=jdk.tools
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ learningLucene ---
[INFO] org.lifelongprogrammer:learningLucene:jar:1.0
[INFO] \- org.apache.solr:solr-core:jar:4.9.0:compile
[INFO]    \- org.apache.hadoop:hadoop-annotations:jar:2.2.0:compile
[INFO]       \- jdk.tools:jdk.tools:jar:1.7:system

Turn out, solr-code depends on hadoop-annotation which then need jdk.tools.jar.

The Solution
Google search, find this page: 

<dependency>
  <groupId>jdk.tools</groupId>
  <artifactId>jdk.tools</artifactId>
  <scope>system</scope>
  <systemPath>C:/Program Files/Java/jdk1.8.0/lib/tools.jar</systemPath>
  <!-- have to include the version, otherwise eclipse throws exception: 
    Errors running builder 'Maven Project Builder' on project 'learningLucene'. 
    java.lang.NullPointerException -->
  <version>8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.8</source>
      <target>1.8</target>
    </configuration>
  </plugin>
</plugins>
</build>

Ant: Different Ways to Call Another Target


AntCall Task
Call another target within the same buildfile optionally specifying some properties.
<target name="default">
  <antcall target="doSomethingElse">
    <param name="param1" value="value"/>
  </antcall>
</target>
Ant antfile
Call target in another file.
<ant antfile="${liteLucene-project-basedir}/shrink-solr.xml" target="shrink">
<property name="original.home" value="${main-build-path}\${application-name}" />
<property name="shrinked.home" value="${main-build-path}\shrinked-${application-name}" />
<property name="shrinked.tmp" value="${main-build-path}\shrinked-tmp" />
</ant>
Ant Include
Include another build file into the current project.
<include file="${parent-project-build-imp-xml}" as="parent"/>
<target name="package" depends="parent.init, parent.build-package, overwrite-solr-home, create-template, parent.post-clean"/>
How is <import> different from <include>?
The short version: Use import if you intend to override a target, otherwise use include.

Subant Task
Calls a given target for all defined sub-builds.
Example-Solr's build file:

<target name="compile" description="Compile Lucene and Solr">
    <sequential>
      <subant target="compile" inheritall="false" failonerror="true">
        <fileset dir="lucene" includes="build.xml" />
        <fileset dir="solr" includes="build.xml" />
      </subant>
    </sequential>
</target>

Labels

ANT (6) Algorithm (69) Algorithm Series (35) Android (7) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) JSON (7) Java (186) JavaScript (27) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) adsense (5) bat (8) regex (5) xml (5)